Связанный менеджер Django ManyToMany без объектов возвращает True - PullRequest
0 голосов
/ 06 сентября 2018

Django 1.9, Python 3.6, postgres DB

Существует Calendar и CalendarOwner, где отношение «многие ко многим» определено в Calendar.

class Calendar(models.Model):
    ...
    calendar_owners = models.ManyToManyField(
        'some_app.CalendarOwner',
        blank=True,
        related_name='calendars',
    )
    ...
    def calendar_method(self):
        return self.calendar_owners.calendar_owner_method()


class CalendarOwner(models.Model):
    ...
    def calendar_owner_method(self):
        ...
        # returns a bool, depends on condition

Когда я звоню Calendar.calendar_method() для Calendar, с которым связано CalendarOwner (s), CalendarOwner.calendar_owner_method() вызывается для каждого CalendarOwner и работает как задумано - я получаю логическое значение в соответствии с любой логикой У меня там.
Я думаю, что он работает так, что из всех вызовов метода, если есть хотя бы один True, выполнение прерывается и возвращаемое значение равно True.
В противном случае он вызовет все связанные объекты и, наконец, возврат False.

Вопрос: Почему, когда я звоню Calendar.calendar_method(), когда CalendarOwner (s) не связаны с Calendar, он никогда не вызывает CalendarOwner.calendar_owner_method() и всегда возвращает True. Это поведение по умолчанию?

Пример: * * тысяча двадцать-восемь

>>> obj = Calendar()
<Calendar: Str>
>>> obj.calendar_owners.count()
0
>>> obj.calendar_owners.calendar_owner_method()
True

Имеет смысл, что, поскольку с этим Calendar не связаны CalendarOwner, CalendarOwners.calendar_owner_method() вообще не будет вызываться. Но почему он возвращает True? Может кто-нибудь указать мне на документы?

Я могу проверить, равен ли Calendar.calendar_owners.count() ноль, и вернуть False, но я хочу посмотреть, есть ли лучший способ сделать это в Django.

1 Ответ

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

obj.calendar_owners является диспетчером , а не экземпляром CalendarOwner, поэтому он не имеет calendar_owner_method.

...