오브젝트가 있으면 어떻게 가져오고, 없으면 없음으로 가져오나요?
내가 개체를 가져오려는 매니저 요구한다면, 모델매니저에게물건을 가져오라고 하면을 발생시킵니다.DoesNotExist
없을 때 매칭 개체다.일치하는개체가 없는 경우.
go = Content.objects.get(name="baby")
대신 대신에DoesNotExist
어떻게,어떻겔 수 있하면go
있달None
대신에?대신?
이것을 「빌트인」하는 방법은 없습니다.장고는 매번 DoesNotExist 예외를 발생시킵니다.python으로 이것을 처리하는 관용적인 방법은 try catch로 랩하는 것입니다.
try:
go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
go = None
내가 뭘 했니, subclass 모델는 것이다.제가 한 일은 모델을 서브클래스로 만든 겁니다.매니저라구요,, 생성 매니저를 만드safe_get
코드를 위에 그리고 내 모델들을 위하여 그 매니저를 사용한 것처럼.위의 코드처럼 내 모델에는 매니저를 사용합니다.쓸 수 있을지 그 방법:이렇게 하면 다음과 같이쓸 수 있습니다.SomeModel.objects.safe_get(foo='bar')
..
django 1.6에서는 다음과 같이 first() 메서드를 사용할 수 있습니다.
Content.objects.filter(name="baby").first()
get()
한을 올리다를 자아낸다DoesNotExist
지정된 파라미터에 대한 개체를 찾을 수 없는 경우 예외입니다.이 예외는 모델 클래스의 속성이기도 합니다.DoesNotExist
는 외 from에서 상속된다.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
일치하는 항목이 없으면 내용 항목이 반환됩니다.
합니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」MultipleObjectsReturned
에 여러 엔트리가 name="baby"
.
이러한 오류를 방지하려면 데이터 모델에서 이 오류를 처리해야 하지만 런타임에 다음과 같이 기록하는 것이 좋습니다.
def get_or_none(classmodel, **kwargs):
try:
return classmodel.objects.get(**kwargs)
except classmodel.MultipleObjectsReturned as e:
print('ERR====>', e)
except classmodel.DoesNotExist:
return None
다음과 같이 할 수 있습니다.
go = Content.objects.filter(name="baby").first()
Go variable은 원하는 개체이거나 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
존재 여부만 알고 싶은 경우에 대한 대안일 뿐입니다.
이 기능은 재실장하고 싶지 않은 성가신 기능 중 하나입니다.
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
사용하는 것이 좋을지도 모릅니다.
User.objects.filter(username=admin_username).exists()
다른 시점에서 예외를 처리하는 것은 매우 번거로울 수 있습니다.커스텀 모델 매니저를 models.py 파일에서 정의하는 방법은 다음과 같습니다.
class ContentManager(model.Manager):
def get_nicely(self, **kwargs):
try:
return self.get(kwargs)
except(KeyError, Content.DoesNotExist):
return None
그런 다음 콘텐츠 모델 클래스에 포함시킵니다.
class Content(model.Model):
...
objects = ContentManager()
이렇게 하면 뷰에서 쉽게 처리할 수 있습니다.
post = Content.objects.get_nicely(pk = 1)
if post:
# Do something
else:
# This post doesn't exist
예외 처리, 조건문 또는 Django 1.6+ 요건을 수반하지 않는 간단한 한 줄 솔루션을 원하는 경우 대신 다음과 같이 하십시오.
x = next(iter(SomeModel.objects.filter(foo='bar')), None)
사용하는 것도 나쁘지 않다고 생각합니다.get_object_or_404()
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
이 예는 다음과 같습니다.
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
get_object_or_404()에 대한 자세한 내용은 django 온라인 설명서를 참조하십시오.
django 1.7 이후로는 다음 작업을 수행할 수 있습니다.
class MyQuerySet(models.QuerySet):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except self.model.DoesNotExist:
return None
class MyBaseModel(models.Model):
objects = MyQuerySet.as_manager()
class MyModel(MyBaseModel):
...
class AnotherMyModel(MyBaseModel):
...
"MyQuerySet.as_manager()"의 장점은 다음 두 가지가 모두 작동한다는 것입니다.
MyModel.objects.filter(...).get_or_none()
MyModel.objects.get_or_none()
이것은 메서드가 없음을 반환하는 것을 제외하고 Django의 get_object_or_404에서 복사한 것입니다.이 기능은 다음 기능을 사용해야 할 때 매우 유용합니다.only()
특정 필드만 검색하려면 query를 선택합니다.이 메서드는 모델 또는 쿼리 세트를 사용할 수 있습니다.
from django.shortcuts import _get_queryset
def get_object_or_none(klass, *args, **kwargs):
"""
Use get() to return an object, or return None if object
does not exist.
klass may be a Model, Manager, or QuerySet object. All other passed
arguments and keyword arguments are used in the get() query.
Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
one object is found.
"""
queryset = _get_queryset(klass)
if not hasattr(queryset, 'get'):
klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
raise ValueError(
"First argument to get_object_or_none() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
return None
다음은 도우미 기능의 변형입니다. 이 기능을 통해 옵션으로 전달될 수 있습니다.QuerySet
모델 이외의 쿼리 집합에서 고유한 개체(존재하는 경우)를 가져오려는 경우all
오브젝트 쿼리셋(예를 들어 부모 인스턴스에 속하는 자녀 항목의 서브셋):
def get_unique_or_none(model, queryset=None, **kwargs):
"""
Performs the query on the specified `queryset`
(defaulting to the `all` queryset of the `model`'s default manager)
and returns the unique object matching the given
keyword arguments. Returns `None` if no match is found.
Throws a `model.MultipleObjectsReturned` exception
if more than one match is found.
"""
if queryset is None:
queryset = model.objects.all()
try:
return queryset.get(**kwargs)
except model.DoesNotExist:
return None
이는 두 가지 방법으로 사용할 수 있습니다. 예:
obj = get_unique_or_none(Model, **kwargs)
이전에 논의한 바와 같이obj = get_unique_or_none(Model, parent.children, **kwargs)
예외 없이:
if SomeModel.objects.filter(foo='bar').exists():
x = SomeModel.objects.get(foo='bar')
else:
x = None
예외 사용:
try:
x = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
x = None
python에서 예외를 언제 사용해야 하는지에 대한 약간의 논쟁이 있다.한편으로는 "허락보다 용서를 구하는 것이 더 쉽다."나는 이것에 동의하지만, 예외는 남아야 하고, 「이상적인 경우」는 히트하지 않고 실행되어야 한다고 생각한다.
다음과 같은 모델에 부착된 Django 빌트인 예외를 사용할 수 있습니다..DoesNotExist
그래서 우리는 수입할 필요가 없다.ObjectDoesNotExist
예외.
대신 다음 작업을 수행합니다.
from django.core.exceptions import ObjectDoesNotExist
try:
content = Content.objects.get(name="baby")
except ObjectDoesNotExist:
content = None
다음과 같이 할 수 있습니다.
try:
content = Content.objects.get(name="baby")
except Content.DoesNotExist:
content = None
저도 같은 문제에 직면해 있었습니다.쓰고 읽기가 어렵다try-except
@Arthur Debert의 답변에서와 같이 모델에서 요소를 얻고 싶을 때마다.그래서 제 해결책은,Getter
모델에 의해 상속되는 클래스:
class Getter:
@classmethod
def try_to_get(cls, *args, **kwargs):
try:
return cls.objects.get(**kwargs)
except Exception as e:
return None
class MyActualModel(models.Model, Getter):
pk_id = models.AutoField(primary_key=True)
...
이렇게 하면 실제 요소를 얻을 수 있습니다.MyActualModel
또는None
:
MyActualModel.try_to_get(pk_id=1)
저는 Django 2.2.16을 사용하고 있습니다.이 문제를 해결하는 방법은 다음과 같습니다.
from typing import Any
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models.base import ModelBase
from django.db.models.manager import Manager
class SManager(Manager):
def get_if_exist(self, *args: Any, **kwargs: Any):
try:
return self.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
class SModelBase(ModelBase):
def _prepare(cls):
manager = SManager()
manager.auto_created = True
cls.add_to_class("objects", manager)
super()._prepare()
class Meta:
abstract = True
class SModel(models.Model, metaclass=SModelBase):
managers = False
class Meta:
abstract = True
그 후 모든 모델에서 다음 항목만 Import하면 됩니다.
from custom.models import SModel
class SUser(SModel):
pass
그리고...views
, 다음과 같이 호출할 수 있습니다.
SUser.objects.get_if_exist(id=1)
나는 예외 없이 이 방법을 선호한다.또한 오브젝트 없이 여러 오브젝트를 처리합니다.
go_list = Content.objects.filter(name="baby")
if (len(go_list) == 1):
go = go_list[0]
else:
go = None # optionally do other things if there are multiple objects / no objects.
한 조각 드실래요?제한값 1까지 해석됩니다.
go = Content.objects.filter(name="baby")[0]
언급URL : https://stackoverflow.com/questions/3090302/how-do-i-get-the-object-if-it-exists-or-none-if-it-does-not-exist-in-django
'programing' 카테고리의 다른 글
해시 테이블 VS 관련 어레이 (0) | 2022.09.28 |
---|---|
포커스가 있는 DOM 요소를 확인하려면 어떻게 해야 하나요? (0) | 2022.09.28 |
Javascript에서 현재 포맷된 날짜 dd/mm/yyy를 가져와 입력에 추가하는 방법 (0) | 2022.09.28 |
MySQL 그룹이 느려지는 이유는 무엇입니까? (0) | 2022.09.28 |
MySQL - NULL 입력 방법 (0) | 2022.09.28 |