Проверьте, существуют ли отношения ManyToMany на определенную дату, затем исключите эту запись - PullRequest
0 голосов
/ 02 марта 2020

У меня есть эта модель:

class Assignment(models.Model)
    assignment_date = models.DateField(blank=True, null=True)
    chosen_driver = models.ManyToManyField('driver.Driver', blank=True, verbose_name=_(
        "Chosen driver"), related_name="driver_chosen")
    ...

Выбранный водитель может иметь только одно назначение в день. Поэтому, когда я получаю Assignment набор запросов, я хочу проверить assignment_date, а затем посмотреть, есть ли у модели Driver назначение с этой датой.

Поэтому я подумал что-то вроде этого:

driver = get_object_or_404(Driver, pk=1)

dcl = []
for entry in driver.driver_chosen.all():
    dcl.append(entry.assignment_date)

Затем у нас есть список со всеми датами назначений, где выбран этот Driver.

Затем при построении набора запросов из Assignment может быть что-то подобное для сравнения дат с каждым other и исключить из набора запросов:

for entry in Assignment.objects.all()
    if entry.assignment_date in dcl:
        queryset = Assignment.objects.exclude(entry.pk)
        return queryset

Но это возвращает ошибку TypeError: cannot unpack non-iterable int object.

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 02 марта 2020

Если вам нужен набор запросов со всеми Assignments, для которых может быть назначен драйвер, я бы рекомендовал не играть с lists, а делать все это в запросе. Например:

driver = get_object_or_404(Driver, pk=1)
dates = Assignment.objects.filter(chosen_driver=driver).values_list('assignment_date', flat=True)
qs = Assignment.objects.exclude(assignment_date__in=dates)

или в одну строку:

qs = Assignment.objects.exclude(
       assignment_date__in=Assignment.objects.filter(
        chosen_driver=driver
     ).values_list('assignment_date', flat=True)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...