结果之间是否存在差异:
MyModel.objects.filter(pk=1)
和
MyModel.objects.get(pk=1)
如果没有区别,那么为什么存在.get()方法?
答案 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)
看看那个的输出。