Python Django过滤:模型实例与模型pk
我(至少对我来说)在Django偶然发现了一些相当奇怪的行为。我不确定这是否被支持/允许 假设我有以下模型:Python Django过滤:模型实例与模型pk,python,django,Python,Django,我(至少对我来说)在Django偶然发现了一些相当奇怪的行为。我不确定这是否被支持/允许 假设我有以下模型: 班级俱乐部 name=CharField(..) memberships=models.ManyToManyField(Person,through=ClubMembership,related_name='clubs') def getMembership(自我、个人ID): 返回ClubMembership.objects.get(club\u id=self.id,person\u
班级俱乐部
name=CharField(..)
memberships=models.ManyToManyField(Person,through=ClubMembership,related_name='clubs')
def getMembership(自我、个人ID):
返回ClubMembership.objects.get(club\u id=self.id,person\u id=personID)
显然,getMembership
返回关联的ClubMembership
实例(现在,假设我们只为实际在俱乐部中的人调用此方法)
现在,当调用此方法时,我发现:
club=club.objects.get(…)
person=person.objects.get(…)
会员资格=俱乐部。获得会员资格(人)
及
club=club.objects.get(…)
person=person.objects.get(…)
会员资格=club.getMembership(person.id)
都产生了正确的成员资格。在检查passend关键字(对于person\u id
)实际上是整数(pk)还是模型实例的过滤器
/get
方法中是否发生了一些神奇的事情
如果两者都是有效且允许的,那么其含义是什么?在性能方面有什么不同吗?哪种方法更可取
Ofc I可以过滤整个人模型,而不仅仅是id,如下所示:
def getMembership(自我、个人):
返回ClubMembership.objects.get(club_id=self.id,person=person)
但是,这样做会慢很多,对吗?正如文档中的一节所述,整数(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
这也适用于“反向”方式。filter(obj=inst),.filter(obj_id=inst)?是的,Django将其归结为最终相同的SQL查询(它们对速度的影响最大)。