django Model.objects.get()或None

r6hnlfcb  于 2023-08-08  发布在  Go
关注(0)|答案(5)|浏览(142)

是否有一种方法可以在一次呼叫中完成以下操作:

Model.objects.get(id=1) else None

字符串
我找到的唯一方法就是:

try:
    object = Model...
except:
    object = None


有没有办法在django的一次调用中做到这一点?

更新:除了在try/except块中,似乎没有其他方法可以做到这一点,但这里有一个更好的答案:In Django, how do I objects.get, but return None when nothing is found?

vatpfxk5

vatpfxk51#

不如这样:

obj = Model.objects.filter(id=1).first()

字符串
现在,如果没有id=1的对象存在,则obj将为None
参考:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#django.db.models.query.QuerySet.first

wxclj1h5

wxclj1h52#

如果你在web请求中使用它,并且你想在对象不存在时返回404,也许你应该使用

get_object_or_404(Mode, pk=1)

字符串

jdg4fx2g

jdg4fx2g3#

这个怎么样?

model_to_find = next(iter(Model.objects.filter(id=1)), None)

字符串

twh00eeo

twh00eeo4#

get_object_or_404
在你的模型中。……

@models.permalink
def get_absolute_url(self):
    return "/blog/%s/" self.slug

字符串

llmtgqce

llmtgqce5#

我认为最好尽可能多地重用Django功能,并且Django有99%类似的func get_object_or_404,它只是引发了Http404

from django.shortcuts import get_object_or_404

def get_or_none(model_or_qs, **kwargs):
    try:
        return get_object_or_404(model_or_qs, **kwargs)
    except Http404:
        return None

字符串

部分测试用例说明代码可用于Model、Queryset、RelatedManager

  • [在测试中,一个用户可以有多个联系人]*
@test_for(get_or_none)
    def test_get_or_none_for_model(self):
        self.assertEqual(self.user, get_or_none(User, pk=self.user.pk))
        self.assertEqual(None, get_or_none(User, pk=777))

    @test_for(get_or_none)
    def test_get_or_none_for_queryset_and_manager(self):
        contact = ContactFactory(user=self.user)
        self.assertEqual(self.user, get_or_none(User.objects, pk=self.user.pk))
        self.assertEqual(self.user, get_or_none(User.objects.all(), pk=self.user.pk))
        self.assertEqual(contact, get_or_none(Contact.objects.filter(user=self.user)))
        self.assertEqual(contact, get_or_none(self.user.contacts))
        self.assertEqual(None, get_or_none(User.objects.all(), pk=777))
        self.assertEqual(None, get_or_none(self.user.contacts, pk=777))

相关问题