Джанго многие ко многим сравнивают - PullRequest
3 голосов
/ 05 марта 2011

Можно ли сравнить два отношения ManyToMany из разных моделей?

У меня есть модель Дни общего и с этими двумя другими моделями:

  • Билет (Билет имеет отношение m2m к Дням)
  • Чек (чек имеет отношение m2m к Дням)

Я могу сделать это с двумя для того, что выглядит не очень красиво или читабельно.

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Если я правильно читаю ваш вопрос, вы можете достичь того, о чем просите, определив связанные имена в объявлениях m2m в моделях Ticket и Check, а затем сравнив наборы запросов

пример:

class Day(models.Model):
    day = models.DateField()

class Ticket(models.Model):
    ticket_name = models.CharField()
    days = models.ManyToMany(Day, related_name="tickets")

class Check(models.Model):
    check_name = models.CharField()
    days = models.ManyToMany(Day, related_name="checks")

Теперь, чтобы найти все билеты и чеки за указанный день, сравнить их можно:

date = datetime.date(day=1, month=1, year=2000)
day = Day.objects.select_related().get(day=date)

ts = day.tickets
cs = day.checks

, если вы хотите, чтобы все чеки в дни, связанные с Билетом, указываются в ticket_name = ticket:

checks_for_ticket = Check.objects.filter(days__tickets__ticket_name="tickets")

если вы хотите получить все билеты в дни, связанные с чеком с check_name = check:

tickets_for_check = Ticket.objects.filter(days__checks__check_name="check")
0 голосов
/ 06 марта 2011

Я действительно не знаю, что вы после. Вы хотите получить все Ticket s с тем же days, что и Check day s?

class Day(models.Model):
    # don't know what fields exist..
    date = models.DateField(...)

check = Check.objects.all()[0]
check_dates = [day.date for day in check.days.all()]
tickets_for_check = Ticket.objects.filter(days__date__in=check_dates)

Это предполагает, что экземпляр Ticket-Day с датой 'x' имеет другой идентификатор, чем экземпляр Check-Day с датой 'x'. По сути, один и тот же день - это другой экземпляр, в зависимости от того, из какой он модели.

Пример вывода был бы неплох, а также описание вашей модели. Это должно сделать трюк, хотя. О, сравнение по значению в таблице, а не по идентификатору будет работать ужасно. Либо переосмыслите свою модель данных так, как предлагает @Thomas, либо создайте индекс для свойства date вашей модели Day.

...