python - 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.']
感谢您的帮助!
解决方案
您可以使用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 之一大于该字段的那一刻起将其排除。Chat
DeleteChat
from_date
last_updated
.exclude()
from_date
last_updated
如果一个Chat
对象最多有一个DeletedChat
对象,您可能需要考虑使用OneToOneField
[Django-doc]。
推荐阅读
- git - 如何让 Heroku 不坚持我的本地 Git 存储库“落后”并要求合并?
- java - 在方法中使用日志跟踪方法的执行是不好的做法?
- java - Gradle for Android 的问题 -> Android Studio 请求添加元数据,但它不起作用
- c++ - blinn phong 照明产生奇怪的结果
- javascript - 反应 onLoad img 事件未按预期工作
- image - Woocommerce 使用缩略图问题子店面主题
- python - 从文件中总结价格,然后打印并附加总值
- r - R:Kruskal-Wallis 测试循环遍历数据框中的指定列
- css - CSS 网格,网格单元的自动填充和自动调整大小
- c# - 使用 PasswordChar True 在文本框上显示文本