代码之家  ›  专栏  ›  技术社区  ›  B.Adler

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

  •  0
  • B.Adler  · 技术社区  · 7 年前

    我有两个相互关联的多对多模型。我想根据另一个字段User筛选其中一个字段Message。与第一条消息上的字段相比,在处创建了\u。编辑\u日期。

    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 回复  |  直到 7 年前
        1
  •  2
  •   solarissmoke    7 年前

    可以筛选相关模型上的字段 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() 结束。