개체가 존재하는 경우 어떻게 얻거나 존재하지 않는 경우 없음을 어떻게 얻습니까?

모델 관리자에게 객체를 요청하면 DoesNotExist일치하는 객체가 없을 때 발생합니다.

go = Content.objects.get(name="baby")

대신에 DoesNotExist, 내가 가지고 할 수있는 방법 go이 될 None대신?



답변

이를위한 ‘내장’방법은 없습니다. 장고는 매번 DoesNotExist 예외를 발생시킵니다. 파이썬에서 이것을 처리하는 관용적 인 방법은 그것을 시도 캐치로 감싸는 것입니다.

try:
    go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
    go = None

내가 한 것은 모델을 서브 클래스하는 것입니다 .Manager, safe_get위의 코드와 같은 코드를 만들고 해당 관리자를 사용하십시오. 그렇게하면 다음과 같이 쓸 수 있습니다 : SomeModel.objects.safe_get(foo='bar').


답변

django 1.6부터 first () 메소드를 다음과 같이 사용할 수 있습니다 .

Content.objects.filter(name="baby").first()


답변

장고 문서에서

get()DoesNotExist주어진 매개 변수에 대해 개체를 찾을 수 없으면 예외 가 발생합니다. 이 예외는 모델 클래스의 속성이기도합니다. DoesNotExist 에서 예외 상속django.core.exceptions.ObjectDoesNotExist

예외를 잡아서 None갈 수 있습니다.

from django.core.exceptions import ObjectDoesNotExist
try:
    go  = Content.objects.get(name="baby")
except ObjectDoesNotExist:
    go = None


답변

이를위한 일반 함수를 만들 수 있습니다.

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.DoesNotExist:
        return None

아래와 같이 사용하십시오 :

go = get_or_none(Content,name="baby")

일치하는 항목이 없으면 go는 None이되며 Content 항목을 반환합니다.

참고 : name = “baby”에 대해 둘 이상의 항목이 반환되면 MultipleObjectsReturned 예외가 발생합니다.


답변

이 방법으로 할 수 있습니다 :

go  = Content.objects.filter(name="baby").first()

이제 go 변수는 원하는 객체이거나 None 일 수 있습니다.

참조 : https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first


답변

일을 쉽게하기 위해 여기에 멋진 답변의 입력을 기반으로 작성한 코드 스 니펫이 있습니다.

class MyManager(models.Manager):

    def get_or_none(self, **kwargs):
        try:
            return self.get(**kwargs)
        except ObjectDoesNotExist:
            return None

그런 다음 모델에서

class MyModel(models.Model):
    objects = MyManager()

그게 다야. 이제 MyModel.objects.get () 및 MyModel.objetcs.get_or_none ()이 있습니다.


답변

exists필터와 함께 사용할 수 있습니다 .

Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS

존재하는지 알고 싶은 경우에 대한 대안