Джанго |Как сделать обратную связь с двумя моделями - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу сделать систему тикетов.У меня есть основная модель (TicketSystem) и модель с сообщениями от пользователей (TicketSystem_Messages).

В модели "TicketSystem_Messages" есть ForeignKey для модели "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'])

Я хочу сделать левое соединение, как это

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

Я что-то слышал о "select_related" и "prefetch_related" и пробовал, но это не работает.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Если я хочу перечислить все билеты с последним статусом из модели "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 %}

Это работает: -)

0 голосов
/ 25 сентября 2018

Вместо использования необработанных объединений 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)
...