2013-10-18 2 views
7

사용자가 레코드를 업데이트 할 수 있어야하는 API를 만듭니다. 상태 업데이트 또는 이름 변경과 같이 대부분의 경우 하나의 필드 만 변경됩니다. 이것은 PATCH 요청에 대한 적절한 유스 케이스 시나리오로 보인다. 내가 이해하기에 이것은 '부분적인'업데이트입니다.Django REST Framework 패치가 필수 입력란에서 실패합니다.

장고의 REST 프레임 워크를 구현하여이 문제를 해결했습니다. "AccountUser"와 같은 레코드의 경우 이름 필드 만 변경하여 다음 요청을 보내려고합니다. 패치/api/users/1/HTTP/1.1 호스트 : localhost X-CSRFToken : 111122223333444455556666 콘텐츠 유형 : 응용 프로그램/JSON; 문자셋 = UTF-8 캐시 제어 : 노 캐시

{ "fullname": "John Doe" } 

기록은 분명히 이러한 새로운 필요 '계정'으로 '관련'분야의 몇 가지를 포함하여 다른 특성을가 기록. 요청을 제출할 때 응답은 다음 본문의 400 오류입니다. { "account": [ "이 입력란은 필수 항목입니다."

class AccountUserSerializer(serializers.ModelSerializer): 
    account = serializers.PrimaryKeyRelatedField() 

class Meta: 
    model = AccountUser 
    fields = ('id', 'account', 'fullname', ...) 
    depth = 1 

을 그리고 모델은 다음과 같습니다 :]} 는 사용자의 시리얼은 다음과 같다 내가 여기서 뭔가 잘못하고 또는이다 건가요

class AccountUser(models.Model): 
    ''' Account User''' 
    fullname = models.CharField(max_length=200, 
     null=True,blank=True) 
    account = models.ForeignKey(Account, 
     on_delete=models.PROTECT 
     ) 

    objects = AccountUserManager() 

    def __unicode__(self): 
     return self.email 

    class Meta: 
     db_table = 'accounts_account_user' 

잘못 업데이트 할 수 있기를 기대하는 방법 이 방법으로 레코드의 단일 필드. 감사! 이 커뮤니티는 흔들립니다!

편집 : 요청 - AccountUserManager : 관리자가 사용자를 필터링처럼

class AccountUserManager(BaseUserManager): 

    def create_user(self, email, account_name): 
     username = hash_email_into_username(email) 
     ... 
     account = Account.objects.get(name=account_name) 
     account_user = AccountUser(email=email,user=user,account=account) 
     account_user.save() 
     return account_user 
+0

시도 ='account''을 볼 수 있습니다 ..' –

+0

을'Account' 모델에 대한 역방향 조회 만하다고. –

+0

이 수 당신은'AccountUserManager'를 게시하고 있습니까? 저는 매니저가'pk = 1'에서 객체를 반환하지 않아서'partial_update'를 호출하는 패치 호출이 새로운 인스턴스를 생성해야한다고 생각한다는 것을 짐작하고 있습니다. –

답변

1

그것은 보이지 않는다. 나는 당신이 pdb를 사용하고 당신의 뷰 코드에서 breakpoint를 설정하고 새로운 레코드를 생성하려고 시도한 이유를 살펴 보도록 권할 것이다. 항상 부분 업데이트를 완료하기 위해 PATCH를 사용하고 문제없이 업데이트하기 위해 몇 가지 필드 만 보내도록 보증 할 수 있습니다.

만 다른 생각은 당신 만 fullname 필드를 보내는 보여줍니다 예를 나열하는 경우에도 유효성 검사 오류를 트리거하는 것 (같은 null를) account에 대한 값을 보내는 방법이 몇 가지있어 것입니다.

0

일부 업데이트는 내 answer을 참조하십시오. 또한 당신은, models.ForeignKey (계정 '에서 DRF docs과`related_name를 추가이 하나 docs

관련 문제