繁体   English   中英

Django:按元素属性过滤查询集

[英]Django: Filter queryset by property of Element

我有两个模型,Chat 和 DeletedChat。 现在我想获取user所有聊天记录,删除那些from_date字段,在DeletedChat ,比聊天本身的last_updated大的那些。 我怎么做?

class Chat(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    last_updated = models.DateTimeField(auto_now=True)

class DeletedChat(models.Model):
    chat = models.ForeignKey(Chat, on_delete=models.CASCADE)
    from_date = models.DateTimeField(default=timezone.now)

在我的views.py我尝试了:

chat_ids = request.user.deletedchat_set.exclude(from_date__lt='chat__last_updated').values_list('chat', flat=True)

这给了我以下错误: ['“chat__message__set__last” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.'] ['“chat__message__set__last” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.']

感谢您的帮助!

您可以使用F对象来引用字段:

from django.db.models import F, Q

Chat.objects.filter(Q(deletedchat=None) | Q(deletedchat__form_date__lt=F('last_updated')))

这将返回没有相关DeletedChat对象的Chat对象,或者DeletedChat对象的form_date小于Chat对象的last_updated字段。

我们也可以使用.exclude()

from django.db.models import F

Chat.objects.exclude(deletedchat__form_date__gte=F('last_updated'))

但是,如果有多个相关的DeleteChat对象,则两者并不等效。 在这种情况下,如果存在至少一个相关的DeleteChat对象且from_date小于last_updated字段,则.filter(..)变体仍然可以包含Chat 对于.exclude() ,它将从from_date之一大于last_updated字段的那一刻起排除它。

如果Chat对象至多有一个DeletedChat对象,您可能需要考虑使用OneToOneField [Django-doc]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM