基于唯一键的Django加盟模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于唯一键的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)
我想根据同一个线程连接聊天和User_Thread模型。我怎样才能实现这个目标?有什么想法吗?
答案
你可以得到 User_Thread
某个 Chat
与。
my_chat.thread.user_thread_set.all()
如果你想这样做,对于一些... Chat
的,你可以 .prefetch_related(..)
[Django-doc] 这些与。
chats = Chat.objects.select_related('thread').prefetch_related('thread__user_thread')
这将执行两个查询,并在DjangoPython层进行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))
以上是关于基于唯一键的Django加盟模式的主要内容,如果未能解决你的问题,请参考以下文章
通过 mongoose 模式将数据存储在 mongodb 中,不传递唯一真键的值
如何创建基于多个唯一键的转换后的 Doctrine 2 实体