【问题标题】:How to make a query on related_name field?如何查询related_name 字段?
【发布时间】:2013-11-27 14:46:29
【问题描述】:

我必须通过 ForeignKey 连接模型

class User(AbstractUser):
   ...

class PrivateMessage(models.Model):
    user_from = models.ForeignKey(
        User,
        verbose_name=u'From',
        related_name='sent_messages',
    )
    user_to = models.ForeignKey(
        User,
        verbose_name=u'To',
        related_name='received_messages',
    )

有没有办法获取特定用户的所有地址。例如,如果

u = User.objects.get(id=1)
messages = PrivateMessage.objects.filter(user_from=u)
for m in messages:
    users.add(m.user_to)

如何仅使用 Django ORM 方法获取出现在user_to 中的这些消息的用户列表?

【问题讨论】:

  • 你可以试试User.objects.filter(received_messages__user_from=u) 吗?

标签: django django-models django-orm


【解决方案1】:

我认为更好的办法是在 User 模型上定义 ManyToManyField

class User(AbstractUser):
    #...
    receivers = models.ManyToManyField('self', through='Message',
                                      symmetrical=False, related_name="senders")

class Message(models.Model):
    user_from = models.ForeignKey(MyUser, related_name='messages_from')
    user_to = models.ForeignKey(MyUser, related_name='messages_to')
    message = models.CharField(max_length=100, default="")
    #...

然后,您只需在另一端检索用户列表:

User.objects.get(id=1).receivers.all()  # who I sent the message to
User.objects.get(id=1).senders.all()    # who sent me a message

这样你就有了一个很好的清晰的 API。

【讨论】:

    【解决方案2】:

    最后,我写了三个查询:

        users_from = set(PrivateMessage.objects.filter(
            user_to=self.request.user,
        ).values_list(
            'user_from__pk',
            flat=True,
        ))
        users_to = set(PrivateMessage.objects.filter(
            user_from=self.request.user,
        ).values_list(
            'user_to__pk',
            flat=True,
        ))
        interlocutors = User.objects.filter(pk__in=users_from.union(users_to))
    

    【讨论】:

      【解决方案3】:

      我看到了这个docs

      也许你可以试试:

      u = User.objects.get(id=1)
      users = User.objects.filter(received_messages__user_from=u).distinct()
      

      【讨论】:

      • 它给了我一个错误FieldError: Cannot resolve keyword 'received_messages' into field.
      • 你确定你没有在某个地方使用 auth.User,这不会有关系吗?
      • 我使用的是AbstractUser,所以在ForeightKey 字段中它看起来像settings.AUTH_USER_MODEL
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2018-01-18
      相关资源
      最近更新 更多