development

Django 모델의 필드를 업데이트하기 위해 사전을 어떻게 사용합니까?

big-blog 2020. 12. 6. 21:47
반응형

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방법은 제한되고 검증 된 필드 세트가 있다는 것입니다. 이는 수동 업데이트의 경우가 아닙니다.

참고 URL : https://stackoverflow.com/questions/5503925/how-do-i-use-a-dictionary-to-update-fields-in-django-models

반응형