基于唯一键的Django加盟模式

问题描述 投票:1回答:1

我有一种情况,我不能基于外键连接模型。我想基于共同键来连接它们,而共同键基本上是第三个表的外键。

请看一下代码。

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模型。我怎样才能实现这个目标?有什么想法吗?

django join
1个回答
0
投票

你可以得到 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_Threads与。

for chat in chats:
    for ut in chat.thread.user_thread_set.all():
        print(''.format(chat.message, ut.receiver_id))
© www.soinside.com 2019 - 2024. All rights reserved.