基于唯一键的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_Threads与。

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

以上是关于基于唯一键的Django加盟模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 的复合/复合主/唯一键

通过 mongoose 模式将数据存储在 mongodb 中,不传递唯一真键的值

如何创建基于多个唯一键的转换后的 Doctrine 2 实体

在这种复杂情况下,如何解决 Django 缺少组合键的问题?

Django管理图标和图像

使用Hibernate基于唯一键查找或插入