Django 过滤:模型实例与模型 pk

Haf*_*uss 4 python django

我偶然发现了 Django 中的一些相当奇怪的行为(至少对我来说是这样)。我不确定这是否受支持/允许的行为。

假设我有以下模型:

class Club
    name = CharField(....)
    memberships = models.ManyToManyField(Person, through=ClubMembership, related_name='clubs')

    def getMembership(self, personID):
        return ClubMembership.objects.get(club_id=self.id, person_id=personID)
Run Code Online (Sandbox Code Playgroud)

显然,getMembership返回关联的ClubMembership实例(现在,我们假设我们只为实际上在俱乐部中的人调用此方法)。

现在,当调用这个方法时,我发现:

club = Club.objects.get(...)
person = Person.objects.get(...)

membership = club.getMembership(person)
Run Code Online (Sandbox Code Playgroud)

club = Club.objects.get(...)
person = Person.objects.get(...)

membership = club.getMembership(person.id)
Run Code Online (Sandbox Code Playgroud)

都产生正确的成员资格。/方法内部是否发生了一些魔法来检查 passend 关键字 (for ) 实际上是整数 (pk) 还是模型实例?filtergetperson_id

如果两者都有效且被允许,会产生什么影响?性能方面有什么差异吗?哪种方法是首选方法?

Ofc 我可以过滤整个人员模型,而不仅仅是 id,如下所示:

def getMembership(self, person):
        return ClubMembership.objects.get(club_id=self.id, person=person)
Run Code Online (Sandbox Code Playgroud)

但据我所知,这会慢很多,对吧?

Ton*_*vić 5

如文档的相关对象查询部分所述,整数 (pk) 或模型实例之间没有区别。

在他们的示例中,如果您有一个 id=5 的 Blog 对象 b,则以下三个查询将是相同的:

Entry.objects.filter(blog=b) # Query using object instance
Entry.objects.filter(blog=b.id) # Query using id from instance
Entry.objects.filter(blog=5) # Query using id directly
Run Code Online (Sandbox Code Playgroud)