姜戈 |如何与两个模型建立反向关系
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 %}
这个有效:-)
我想做一个票务系统。我有主模型 (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 %}
这个有效:-)