如何返回所有记录但排除最后一项

时间:2016-11-23 07:58:18

标签: django django-models

我在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;

请帮忙。

4 个答案:

答案 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:]

您还可以通过替换所有()

来放置您需要的任何过滤器