我在django-models中过滤时遇到问题。
我希望返回特定animal的所有记录,但不包括基于最新created_at值的最后一项,并按降序排序。
我有这个模型。
class Heat(models.Model):
# Fields
performer = models.CharField(max_length=25)
is_bred = models.BooleanField(default=False)
note = models.TextField(max_length=250, blank=True, null=True)
result = models.BooleanField(default=False)
# Relationship Fields
animal = models.ForeignKey(Animal, related_name='heats', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)通过这个原始的sql脚本,我能够达到预期的效果。但我想要一种django方法。
SELECT
*
FROM
heat
WHERE
heat.created_at != (SELECT MAX((heat.created_at)) FROM heat)
AND heat.animal_id = '2' ORDER BY heat.created_at DESC;请帮帮忙。
发布于 2016-11-23 16:03:06
它将会是
Heat.objects.order_by("-created_at")[1:]对于特定的动物,它将是:
Heat.objects.filter(animal_id=2).order_by("-created_at")[1:]queryset上的[1:]使用常规的SQL语法并生成正确的python slice代码。(在这种情况下,只需删除第一个/最近创建的元素)
更新:正如@schwobaseggl在评论中提到的,索引为负的切片在django查询集上不起作用。因此,对象首先是逆序的。
发布于 2016-11-23 16:12:46
我刚刚将您的SQL查询转换为Django ORM代码。
首先,使用aggregation获取最大created_at值并执行exclude。
from django.db.models import Max
heat_objects = Heat.objects.filter(
animal_id=2
).exclude(
created_at=Heat.objects.all().aggregate(Max('created_at'))['created_at__max']
)发布于 2016-11-23 16:13:52
获取最后一条记录:
obj= Heat.objects.all().order_by('-id')[0]进行查询:
query = Heat.objects.filter(animal_id=2).exclude(id=obj['id']).all()https://stackoverflow.com/questions/40758860
复制相似问题