首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回所有记录但排除最后一项

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

Stack Overflow用户
提问于 2016-11-23 15:58:18
回答 4查看 3.5K关注 0票数 2

我在django-models中过滤时遇到问题。

我希望返回特定animal的所有记录,但不包括基于最新created_at值的最后一项,并按降序排序。

我有这个模型。

代码语言:javascript
复制
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方法。

代码语言:javascript
复制
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;

请帮帮忙。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-23 16:03:06

它将会是

代码语言:javascript
复制
Heat.objects.order_by("-created_at")[1:]

对于特定的动物,它将是:

代码语言:javascript
复制
Heat.objects.filter(animal_id=2).order_by("-created_at")[1:]

queryset上的[1:]使用常规的SQL语法并生成正确的python slice代码。(在这种情况下,只需删除第一个/最近创建的元素)

更新:正如@schwobaseggl在评论中提到的,索引为负的切片在django查询集上不起作用。因此,对象首先是逆序的。

票数 9
EN

Stack Overflow用户

发布于 2016-11-23 16:12:46

我刚刚将您的SQL查询转换为Django ORM代码。

首先,使用aggregation获取最大created_at值并执行exclude

代码语言:javascript
复制
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']
)
票数 3
EN

Stack Overflow用户

发布于 2016-11-23 16:13:52

获取最后一条记录:

代码语言:javascript
复制
obj= Heat.objects.all().order_by('-id')[0]

进行查询:

代码语言:javascript
复制
query = Heat.objects.filter(animal_id=2).exclude(id=obj['id']).all()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40758860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档