没有对象的Django ManyToMany相关经理返回True

时间:2018-09-06 00:50:27

标签: django many-to-many django-related-manager

Django 1.9,Python 3.6,postgres DB

存在CalendarCalendarOwner,其中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时,每个CalendarOwner.calendar_owner_method()都会被调用CalendarOwner,并且意图-根据那里的逻辑,我得到一个布尔值。
我认为它的工作方式是从所有方法调用中,如果至少有一个True,则执行中断,返回值为True
否则它将调用所有相关对象,最后返回False

问题: 为什么当我在没有Calendar.calendar_method()CalendarOwner相关联的情况下调用Calendar时却从不调用CalendarOwner.calendar_owner_method()并始终返回True。 这是默认行为吗?

示例:

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

有意义的是,由于没有CalendarOwner与该Calendar相关联,因此CalendarOwners.calendar_owner_method()根本不会被调用。但是为什么它返回True?有人可以指出我的文档吗?

我可以检查Calendar.calendar_owners.count()是否为零并返回False,但我想看看是否有更好的Django方式。

1 个答案:

答案 0 :(得分:0)

obj.calendar_ownersManager而不是CalendarOwner的实例,因此它没有calendar_owner_method