UFO ET IT

장고 모델 인스턴스의 여러 필드를 업데이트하는 방법은 무엇입니까?

ufoet 2020. 12. 10. 20:45
반응형

장고 모델 인스턴스의 여러 필드를 업데이트하는 방법은 무엇입니까?


장고에서 모델 인스턴스의 여러 필드를 업데이트하는 표준 방법은 무엇입니까? ... 필드가있는 모델이 있다면

Class foomodel(models.Model):
    field1 = models.CharField(max_length=10)
    field2 = models.CharField(max_length=10)
    field3 = models.CharField(max_length=10)
    ...

... 주어진 하나의 필드로 인스턴스화 한 다음 별도의 단계에서 나머지 필드를 제공하고 싶습니다. 사전 또는 키 값 매개 변수를 전달하여 어떻게 수행합니까? 가능한?

즉, 해당 모델의 인스턴스에 쓰고 싶은 모든 것을 포함하는 데이터가 포함 된 사전이 있다고 가정 해 보겠습니다. 모델 인스턴스는 별도의 단계로 인스턴스화되었으며 아직 지속되지 않았다고 가정 해 보겠습니다. foo_instance.field1 = my_data_dict['field1']각 필드에 대해 말할 수 있지만, 모델 인스턴스에서 모든 필드-값 쌍을 한 번에 전달하고 업데이트하는 메서드를 호출하는 방법이 있어야한다는 내용이 있습니다. 같은 것 foo_instance.update(my_data_dict). 이와 같은 기본 제공 메서드가 표시되지 않습니다. 누락되었거나 효율적으로 수행되는 방법은 무엇입니까?

나는 이것이 명백한 RTM 종류의 질문이라고 생각하지만 문서에서는 보지 못했습니다.


을 엉망으로 만들고 __dict__싶지만 부모 클래스에서 상속 된 속성에는 적용되지 않습니다.

dict를 반복하여 객체에 할당 할 수 있습니다.

for (key, value) in my_data_dict.items():
    setattr(obj, key, value)

또는 쿼리 세트에서 직접 수정할 수 있습니다 (쿼리 세트가 관심있는 객체 만 반환하는지 확인).

FooModel.objects.filter(whatever="anything").update(**my_data_dict)

이것을 시도해 볼 수 있습니다.

obj.__dict__.update(my_data_dict)

당신이하고 싶은 것은 자연스러워 보이지만 당신처럼 문서에서도 그것을 찾지 못했습니다. 문서는 모델에서 save () 하위 클래스를 만들어야한다고 말합니다. 그리고 그게 제가하는 일입니다.

def save(self, **kwargs):
    mfields = iter(self._meta.fields)
    mods = [(f.attname, kwargs[f.attname]) for f in mfields if f.attname in kwargs]
    for fname, fval in mods: setattr(self, fname, fval)
    super(MyModel, self).save()

기본 키의 이름을 가져 와서으로 필터링 Queryset.filter()하고 업데이트하는 데 사용 Queryset.update()합니다.

fooinstance = ...    
# Find primary key and make a dict for filter
pk_name foomodel._meta.pk.name
filtr = {pk_name: getattr(fooinstance, pk_name)}
# Create a dict attribute to update
updat = {'name': 'foo', 'lastname': 'bar'}
# Apply
foomodel.objects.filter(**filtr).update(**updat)

이렇게하면 기본 키가 무엇이든 인스턴스를 업데이트 할 수 있습니다.


다음을 사용하여 업데이트 update()

Discussion.objects.filter(slug=d.slug)
    .update(title=form_data['title'],
            category=get_object_or_404(Category, pk=form_data['category']),
            description=form_data['description'], closed=True)

참고 URL : https://stackoverflow.com/questions/1576664/how-to-update-multiple-fields-of-a-django-model-instance

반응형