반응형
Django 모델의 필드를 업데이트하기 위해 사전을 어떻게 사용합니까?
다음과 같은 모델이 있다고 가정합니다.
class Book(models.Model):
num_pages = ...
author = ...
date = ...
사전을 생성 한 다음이를 사용하여 모델을 삽입하거나 업데이트 할 수 있습니까?
d = {"num_pages":40, author:"Jack", date:"3324"}
다음은 사전 d를 사용하여 생성하는 예입니다.
Book.objects.create(**d)
기존 모델을 업데이트하려면 QuerySet filter
메서드 를 사용해야합니다 . pk
업데이트하려는 책에 대해 알고 있다고 가정합니다 .
Book.objects.filter(pk=pk).update(**d)
생성하려는 경우 :
Book.objects.create(**d)
기존 인스턴스를 확인해야한다고 가정하면 get 또는 create를 사용하여 찾을 수 있습니다.
instance, created = Book.objects.get_or_create(slug=slug, defaults=d)
if not created:
for attr, value in d.iteritems():
setattr(instance, attr, value)
instance.save()
다른 답변에서 언급했듯이 update
쿼리 세트 관리자 의 기능을 사용할 수도 있지만 신호를 보내지 않을 것이라고 생각합니다 (사용하지 않으면 중요하지 않을 수 있음). 그러나 단일 개체를 변경하는 데 사용해서는 안됩니다.
Book.objects.filter(id=id).update()
**
새 모델을 만드는 데 사용 합니다. 사전을 반복 setattr()
하고 기존 모델을 업데이트하기 위해 사용합니다.
Tom Christie의 Django Rest 프레임 워크에서
https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()
다른 답변 외에도 관련 필드가 엉망이되는 것을 방지하기 위해 좀 더 안전한 버전이 있습니다.
def is_simple_editable_field(field):
return (
field.editable
and not field.primary_key
and not isinstance(field, (ForeignObjectRel, RelatedField))
)
def update_from_dict(instance, attrs, commit):
allowed_field_names = {
f.name for f in instance._meta.get_fields()
if is_simple_editable_field(f)
}
for attr, val in attrs.items():
if attr in allowed_field_names:
setattr(instance, attr, val)
if commit:
instance.save()
업데이트하려는 필드가 편집 가능하고 기본 키가 아니며 관련 필드 중 하나가 아닌지 확인합니다.
사용 예 :
book = Book.objects.first()
update_from_dict(book, {"num_pages":40, author:"Jack", date:"3324"})
고급 DRF 시리얼 라이저 .create
와 .update
방법은 제한되고 검증 된 필드 세트가 있다는 것입니다. 이는 수동 업데이트의 경우가 아닙니다.
반응형
'development' 카테고리의 다른 글
'내부'보호 수준으로 인해 이니셜 라이저에 액세스 할 수 없습니다. (0) | 2020.12.06 |
---|---|
Windows에서 Charles Web Proxy 및 최신 Android 에뮬레이터를 사용하여 SSL 인증서를 구성하는 방법은 무엇입니까? (0) | 2020.12.06 |
선택한 명명 된 인수를 Jinja2의 include 컨텍스트에 전달하는 방법은 무엇입니까? (0) | 2020.12.06 |
Javascript에서 True-> 1 및 False-> 0을 변환 하시겠습니까? (0) | 2020.12.06 |
List와 IEnumerable의 실제 차이점 (0) | 2020.12.06 |