首页 > 解决方案 > Django:按元素的属性过滤查询集

问题描述

我有两个模型,Chat 和 DeletedChat。现在我想获取 a 的所有聊天user,删除那些from_date-fields, in比聊天本身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.']

感谢您的帮助!

标签: pythondjangodjango-models

解决方案


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

from django.db.models import F, Q

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

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

我们还可以利用.exclude()

from django.db.models import F

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

但是,如果有多个相关DeleteChat对象,则两者不等价。在这种情况下,如果存在至少一个小于字段的相关对象,则.filter(..)变量仍然可以包含 a 。对于,它将从s 之一大于该字段的那一刻起将其排除。ChatDeleteChatfrom_datelast_updated.exclude()from_datelast_updated

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


推荐阅读