首页 > 解决方案 > 姜戈 | 如何与两个模型建立反向关系

问题描述

我想做一个票务系统。我有主模型(TicketSystem)和一个包含用户消息的模型(TicketSystem_Messages)。

在模型中“TicketSystem_Messages”是模型“TicketSystem”的ForeignKey。

这是我的代码:

class TicketSystem(models.Model):
    subject = models.CharField(_('Subject'),max_length=30, blank=False, default="N/A")
    message = models.TextField(_('Message'), null=False, blank=False)
    created_date = models.DateTimeField(_('Date'), default=datetime.utcnow().replace(tzinfo=utc))
    fertig_date = models.DateTimeField(_('Date'), default=datetime.utcnow().replace(tzinfo=utc))

class TicketSystem_Messages(models.Model):
    user_name = models.ForeignKey(User)
    status = models.ForeignKey(TicketSystem_Status)
    ticketid = models.ForeignKey(TicketSystem)
    message = models.TextField(_('Message'), null=False, blank=False)
    created_date = models.DateTimeField(_('Sent'), default=datetime.utcnow().replace(tzinfo=utc))

目前我得到没有消息的门票:

sql_TicketSystem = TicketSystem.objects.filter(id=kwargs['pk'])

我想像这样进行 LEFT JOIN

SELECT * FROM TicketSystem LEFT JOIN TicketSystem_Messages ON Ticketsystem.id = TicketSystem_Messages.ticketid

我听说过一些关于“select_related”和“prefetch_related”的东西并尝试过,但它不起作用。

标签: djangoclassmodelrelationshipprefetch

解决方案


在 Django 中,您可以在任一方向遍历模型关系,而不是使用原始 SQL 连接,而不管它们在数据库中是如何表示的。

要查找给定TicketSystem实例的所有消息:

my_ticket = TicketSystem.objects.get(id=0) # or something
my_ticket_messages = my_ticket.ticketsystem_messages_set.all() # or do other filters here

使用 查找所有消息queryset

TicketSystem_Messages.objects.filter(ticketId=my_ticket)

要查找包含多条消息的所有工单:

from django.db import Count
TicketSystem.objects.annotate(message_count=Count('ticketsystem_messagess')).filter(message_count__gt=1)

推荐阅读