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

mie*_*nik 1 django model django-models

结果之间是否存在差异:

 MyModel.objects.filter(pk=1)
Run Code Online (Sandbox Code Playgroud)

 MyModel.objects.get(pk=1)
Run Code Online (Sandbox Code Playgroud)

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

bri*_*ray 7

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

blah =  MyModel.objects.get(pk=1)
Run Code Online (Sandbox Code Playgroud)

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

blah =  MyModel.objects.filter(pk=1234234234)
Run Code Online (Sandbox Code Playgroud)

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

blah =  MyModel.objects.filter(name__contains="Brian")
Run Code Online (Sandbox Code Playgroud)

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

  for b in blah:
      print b.name
Run Code Online (Sandbox Code Playgroud)

另外,另一个与.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)
Run Code Online (Sandbox Code Playgroud)

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

HTH,Brian Ray