我有两个相互关联的模型,有多个模型。我想基于另一个字段User.created_at过滤一个Message,与第一个字段Message.edit_date进行比较。
class Message(Model):
content = CharField(max_length=512, blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
edit_date = models.DateTimeField(blank=True, null=True)
users = models.ManyToManyField('User', related_name='message_user')
class User(Model):
name = content = CharField(max_length=48)
created_at = models.DateTimeField(blank=True, null=True)
现在我通过循环两个模型并在循环中比较它来实现这一点,这很慢。
message_query = Message.objects.none()
for user_name, created_at_date in Users.objects.filter(name='Tina').values_list('id', 'created_at').iterator():
message_query.add(Q(
users=user_id,
edit_date__gte=created_at_date,
), Q.OR)
messages = Message.objects.filter(message_query)
有没有办法为我试图在查询中过滤的项目创建过滤器?
答案 0 :(得分:1)
您可以过滤相关模型directly using F expressions上的字段。这样的事情应该有效:
from django.db.models import F
# This will return all messages where one of the associated users
# was created_at before the message edit_date.
Message.objects.filter(
edit_date__gte=F('users__created_at')
).distinct()
请注意,如果多个用户符合任何给定邮件的此条件,则会返回重复结果 - 因此distinct()
结束。