我在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;
请帮忙。
答案 0 :(得分:7)
将是
Heat.objects.order_by("-created_at")[1:]
对于特定的动物,它将是:
Heat.objects.filter(animal_id=2).order_by("-created_at")[1:]
queryset上的[1:]
具有常规python slice语法并生成正确的SQL代码。 (在这种情况下,只删除第一个/最近创建的元素)
更新:正如@schwobaseggl所提到的,在评论中,负面索引的切片不适用于django查询集。因此,首先反向排序对象。
答案 1 :(得分:1)
我刚刚将您的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']
)
答案 2 :(得分:1)
获取最后记录:
obj= Heat.objects.all().order_by('-id')[0]
进行查询:
query = Heat.objects.filter(animal_id=2).exclude(id=obj['id']).all()
答案 3 :(得分:-1)
查询将是:
Heat.objects.all().order_by('id')[1:]
您还可以通过替换所有()
来放置您需要的任何过滤器