MyModel.objects.filter(pk = 1)和MyModel.objects.get(pk = 1)之间有区别吗?

时间:2009-12-07 23:22:29

标签: django django-models model

结果之间是否存在差异:

 MyModel.objects.filter(pk=1)

 MyModel.objects.get(pk=1)

如果没有区别,那么为什么存在.get()方法?

2 个答案:

答案 0 :(得分:7)

.get()总是返回该对象(如果存在的话)(如果只有一个)。如果它不存在,它也会引发异常。例如

blah =  MyModel.objects.get(pk=1)

blah是MyModel的一个实例。另一方面,.filter()如果不存在则不会返回错误。

blah =  MyModel.objects.filter(pk=1234234234)

然后blah是一个空查询。你可以通过调用.count()来检查这个问题。如果blah.count()== 0表示没有带有密钥1234234234的MyModel项。同样,如果有多个具有该查询的项目说:

blah =  MyModel.objects.filter(name__contains="Brian")

您将获得一个可以进行交互以获得每个结果的查询结果:

  for b in blah:
      print b.name

另外,另一个与.get()类似的有趣方法是.get_or_create()http://www.djangoproject.com/documentation/models/get_or_create/这样你就可以说:

blah,created = MyModel.objects.get_or_create(name="Brian Ray", 
                                             cool=False, 
                                             fun=True)

如果已经存在通常与.get()一起返回的BrianRay,则只返回该实例;否则,它会创造它。注意它返回两件事。第二个只是让呼叫者知道实际发生了什么的标志。

HTH,Brian Ray

答案 1 :(得分:4)

过滤器返回MyModel列表(在本例中为一个列表)。获取返回MyModel的一个实例。

顺便说一下:你可以通过运行来测试这些东西:

manage.py shell
from myapp import models

models.MyModel.objects.filter(pk=1)

models.MyModel.objects.get(pk=1)

看看那个的输出。