Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:按元素属性设置的筛选器查询集_Python_Django_Django Models - Fatal编程技术网

Python Django:按元素属性设置的筛选器查询集

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(

我有两种型号,Chat和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'))