Django объединение моделей на основе уникального ключа - PullRequest
1 голос
/ 22 апреля 2020

У меня есть ситуация, когда я не могу присоединиться к моделям на основе внешнего ключа. Я хочу присоединить их на основе общего ключа, который в основном является внешним ключом третьей таблицы.

Взгляните на код:

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 на основе одного и того же нить. Как мне этого добиться? Есть мысли?

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете получить User_Thread с данного Chat с помощью:

my_chat<b>.thread.user_thread_set.all()</b>

Если вы хотите сделать это для числа Chat с, вы можете .prefetch_related(..) [Django -doc] это с:

chats = Chat.objects.select_related('thread')<b>.prefetch_related('thread__user_thread')</b>

Это выполнит два запроса и выполнит JOIN на слое Django / Python. Выполнение такого 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...