首页 > 解决方案 > 具有 2 个外键的自定义查询集到同一个对象

问题描述

我有一个模型有 2 个外键指向同一模型:

    class Note(models.Model):
        sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='sender_note', on_delete=models.CASCADE)
        receiver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
                                      related_name='reciever_note', on_delete=models.CASCADE)
  status = models.BooleanField(blank=True, null=True)
 action = models.CharField(choices=NOTE_CHOICES, max_length=5, blank=True, null=True)

有些情况下,接收者和发送者是同一用户,但大多数情况下是不同的用户。

我创建了一个自定义查询集,我在其中使用了 RawQueryset:

   qs_str = 'SELECT N.id, N.status,N.action, U.email AS email FROM notes_note AS N LEFT JOIN users_user AS U on N.sender_id=U.id WHERE action IN %s AND status IS NOT TRUE AND U.is_staff=%s'

     qs = Note.objects.raw(qs_str, [action, user_is_staff])

我需要得到:

  1. 接收者和发送者(从他们那里获取属性,尤其是电子邮件)
  2. 检查发件人是否是员工

标签: djangodjango-modelsdjango-queryset

解决方案


对于这样一个简单的案例,没有理由使用原始查询。

Note.objects.filter(sender__is_staff = True, action__in = action)

如果您真的想优化以预取发送者/接收者,您可以使用select_related('sender', 'receiver').


推荐阅读