姜戈 |如何与两个模型建立反向关系

Django | How to make a reverse Relationship with two models

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

在模型中 "TicketSystem_Messages" 是模型 "TicketSystem" 的外键。

这是我的代码:

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" 的事情并试过了,但它不起作用。

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

查找给定 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)

如果我想列出模型 "TicketSystem_Messages" 中最后状态的所有工单,这是行不通的。因此,使用 "TicketSystem.objects.get" 它可以毫无问题地工作。

示例:

sql_TicketSystem = TicketSystem.objects.all()
sql_TicketSystem_Messages = sql_TicketSystem.ticketsystem_messages_set.all()

更新:

{% for data in sql_TicketSystem %}
     {{ data.subject }}
     {% for msg in data.ticketsystem_messages_set.all %}
          {{msg.status}}
     {% empty %}
          Unknown
     {% endfor %}
{% endfor %}

这个有效:-)