Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django过滤:模型实例与模型pk_Python_Django - Fatal编程技术网

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

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

我(至少对我来说)在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 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查询(它们对速度的影响最大)。