모델의 특정 필드 만 업데이트합니다.


93

나는 모델이있다

class Survey(models.Model):
    created_by = models.ForeignKey(User)
    question = models.CharField(max_length=150)
    active = models.NullBooleanField()
    def __unicode__(self):
        return self.question

이제 active필드 만 업데이트하고 싶습니다 . 그래서 이렇게합니다.

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 

이제 오류가 발생 IntegrityError: PRIMARY KEY must be unique합니다.

이 방법으로 업데이트하는 것이 맞습니까?

답변:


189

필드의 하위 집합을 업데이트하려면 다음을 사용할 수 있습니다 update_fields.

survey.save(update_fields=["active"]) 

update_fields인수는 Django 1.5에서 추가되었습니다. 이전 버전에서는 update()대신 방법을 사용할 수 있습니다 .

Survey.objects.filter(pk=survey.pk).update(active=True)

17

일반적으로 하나 이상의 모델 인스턴스에서 특정 필드를 업데이트하는 올바른 방법은 update()각 쿼리 세트 에서 메서드 를 사용하는 것입니다. 그런 다음 다음과 같이합니다.

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

이렇게하면 save()모델이 자동으로 저장되기 때문에 더 이상 모델 을 호출 할 필요가 없습니다 . 또한이 update()메서드는 업데이트의 영향을받은 설문 조사 인스턴스의 수를 반환합니다.


2
감사. .get대신 시도했지만 .filter작동하지 않습니다. 그러나 필터를 사용하면 잘 작동합니다. 위의 코드에 어떤 문제가 있는지 알고 있습니까?
Registered User

귀하의 문제는 question_id. 이 가치는 어디에서 오는가? 그리고 정확히 어떤 줄이 발생 IntegrityError합니까?
pemistahl

question_idURL에서옵니다 (?P<question_id>\d+). 내 잘못은 작동하는 서버에 django 1.4가 설치되어 있고 내 코드가 1.5라는 것입니다. 그러나 귀하의 코드로 잘 작동합니다.
등록 된 사용자

2
@RegisteredUser, 쿼리 세트에만 개체에 "업데이트"메서드가없는 것 같습니다. .filter ()를 사용하면 쿼리 세트 (0 개 이상의 객체 보유)를 다시 가져옵니다. .get ()을 사용하면 단일 객체를 얻습니다.
mgojohn 2014

기본적으로 save()(@Alasdair 솔루션)을 호출 하는 것이 더 안전한 솔루션입니다.이 메서드는 유효성 검사 또는 사용자 지정 코드와 같은 것을 트리거 할 수 있기 때문 update()입니다.
David D.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.