基于唯一密钥的Django连接模型

基于唯一密钥的Django连接模型,django,join,Django,Join,我遇到了一个无法加入基于外键的模型的情况。我想基于公共键(基本上是第三个表的外键)连接它们 看看代码: class Thread(models.Model): timestamp = models.DateTimeField(default=datetime.now) class Chat(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) message = models.Ch

我遇到了一个无法加入基于外键的模型的情况。我想基于公共键(基本上是第三个表的外键)连接它们

看看代码:

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)

我想加入基于相同线程的聊天和用户线程模型。我怎样才能做到这一点?有什么想法吗?

您可以通过以下方式获得给定
聊天
用户线程
s:

my_chat.thread.user_thread_set.all()
这将执行两个查询,并在Django/Python层进行连接。在查询中执行这样的连接将导致大量记录,这些记录可能包含大量重复数据,因此您不能使用这些记录

因此,您可以迭代聊天,例如列出
User\u线程
s,其中包括:

for chat in chats:
    for ut in chat.thread.user_thread_set.all():
        print(''.format(chat.message, ut.receiver_id))

您可以通过以下方式获得给定
聊天
用户线程
s:

my_chat.thread.user_thread_set.all()
这将执行两个查询,并在Django/Python层进行连接。在查询中执行这样的连接将导致大量记录,这些记录可能包含大量重复数据,因此您不能使用这些记录

因此,您可以迭代聊天,例如列出
User\u线程
s,其中包括:

for chat in chats:
    for ut in chat.thread.user_thread_set.all():
        print(''.format(chat.message, ut.receiver_id))