具有2个外键的自定义查询集

时间:2018-09-04 17:58:44

标签: django django-models django-queryset

我有一个模型,其中有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. 检查发件人是否为职员

1 个答案:

答案 0 :(得分:0)

在这种简单情况下,没有理由使用原始查询。

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

如果您确实要优化以预取发送者/接收者,则可以使用select_related('sender', 'receiver')