django - 具有 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])
我需要得到:
- 接收者和发送者(从他们那里获取属性,尤其是电子邮件)
- 检查发件人是否是员工
解决方案
对于这样一个简单的案例,没有理由使用原始查询。
Note.objects.filter(sender__is_staff = True, action__in = action)
如果您真的想优化以预取发送者/接收者,您可以使用select_related('sender', 'receiver')
.
推荐阅读
- python - 使用 .controller 在 tkinter 中的帧之间调用数据
- javascript - 为什么 __proto__ 是一样的
- javascript - 使用 Formik 和 Jest / Enzyme 对文本字段进行单元测试
- ruby - 在 Ruby 中,为什么在 each 语句中使用 puts 函数时三元运算符不起作用?
- javascript - 动态创建数组并在单个循环的内容中将多个元素推入其中
- c# - C# 使用 Token 连接 API
- c# - 如何区分相同的方法调用
- c# - 通过 WebBrowser 控件获取 POST 请求的结果
- sql - Teradata - 仅插入新行
- javascript - 我可以/如何通过 URL 参数在 iframe 中调用 Javascript