首页 > 解决方案 > 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 模型。我怎样才能做到这一点?有什么想法吗?

标签: djangojoin

解决方案


您可以通过以下方式获得User_Thread给定的 s Chat

my_chat.thread.user_thread_set.all()

如果您想为多个Chats 执行此操作,您可以.prefetch_related(..)[Django-doc]使用以下命令:

chats = Chat.objects.select_related('thread').prefetch_related('thread__user_thread')

这将执行两个查询,并在 Django/Python 层执行 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))

推荐阅读