如何根据多对多相关对象的字段过滤django中的模型?

时间:2018-03-30 17:11:03

标签: django django-models many-to-many

我有两个相互关联的模型,有多个模型。我想基于另一个字段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)

有没有办法为我试图在查询中过滤的项目创建过滤器?

1 个答案:

答案 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()结束。