Python Django:按元素属性设置的筛选器查询集
我有两种型号,Chat和DeletedChat。现在我想获得Python Django:按元素属性设置的筛选器查询集,python,django,django-models,Python,Django,Django Models,我有两种型号,Chat和DeletedChat。现在我想获得用户的所有聊天记录,删除那些来自日期的聊天记录,在删除聊天记录中,字段比上次更新的聊天记录本身的字段更大。我该怎么做 class Chat(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) last_updated = models.DateTimeField(auto_now=True) class DeletedChat(
用户的所有聊天记录,删除那些来自日期的聊天记录,在删除聊天记录中,字段比上次更新的聊天记录本身的字段更大。我该怎么做
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\uu message\uu set\uu last”值的格式无效。它必须是YYYY-MM-DD HH:MM[:ss[.uuuuu]][TZ]格式。]
谢谢你的帮助 您可以使用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\u date
小于Chat
对象的last\u updated
字段的聊天对象
我们还可以使用.exclude()
:
从django.db.models导入F
Chat.objects.exclude(删除Chat\uu form\u date\uu gte=F('last\u updated'))
但是,如果存在多个相关的DeleteChat
对象,则这两个对象并不相等。在这种情况下,.filter(..)
变量仍然可以包含一个Chat
,前提是至少存在一个相关的DeleteChat
对象,其from\u date
小于last\u updated
字段。对于.exclude()
,它将从from\u date
s大于last\u updated
字段时将其排除
如果一个Chat
对象最多有一个DeletedChat
对象,您可能需要为一个对象排序。谢谢。我认为您在第二个示例中有一个输入错误,它应该是排除
而不是过滤
,对吗?以防其他人需要这个答案。
from django.db.models import F
Chat.objects.exclude(deletedchat__form_date__gte=F('last_updated'))