django - Django 基于唯一键的连接模型
问题描述
我有一种情况,我无法加入基于外键的模型。我想根据公共键加入它们,该键基本上是第三张表的外键。
看看代码:
class Thread(models.Model):
timestamp = models.DateTimeField(default=datetime.now)
class Chat(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
message = models.CharField(max_length=2000)
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
read = models.BooleanField(default= 0)
timestamp = models.DateTimeField(default=datetime.now)
class User_Thread(models.Model):
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
sender = models.ForeignKey(User, related_name='sender', on_delete=models.CASCADE)
reciever = models.ForeignKey(User, related_name='reciever', on_delete=models.CASCADE)
我想加入基于同一线程的 Chat 和 User_Thread 模型。我怎样才能做到这一点?有什么想法吗?
解决方案
您可以通过以下方式获得User_Thread
给定的 s Chat
:
my_chat.thread.user_thread_set.all()
如果您想为多个Chat
s 执行此操作,您可以.prefetch_related(..)
[Django-doc]使用以下命令:
chats = Chat.objects.select_related('thread').prefetch_related('thread__user_thread')
这将执行两个查询,并在 Django/Python 层执行 JOIN。在查询中执行这样的 JOIN 会导致大量记录可能包含大量重复数据,因此您不能为此使用.select_related(..)
[Django-doc]。
然后,您可以遍历聊天,例如列出User_Thread
s:
for chat in chats:
for ut in chat.thread.user_thread_set.all():
print(''.format(chat.message, ut.receiver_id))
推荐阅读
- java - 用户输入句点时停止的 Java 计算器程序
- python - 在python中一次解析一个yaml列表元素
- firebase - Firestore 的正确收集结构
- java - Spring JPA Hibernate H2
- javascript - 如何从快速路线中调用我的网络爬虫?
- amazon-web-services - aws-lambda-layer-kubectl 配置错误
- node.js - React + GraphQL:在上下文中找不到“客户端”或作为选项传入
- ios - 当 AVPlayer 暂停时,iPhone 锁屏控件不显示,我该如何解决?
- python - 用 numpy/scipy 计算连续向量之间距离的最快方法
- java - 具有 OneToMany 关系的休眠重复条目