2016-08-31 3 views
1

제목이 어리석게 들리지만 저는 User 인스턴스의 Group 개체에 대한 참조를 변경할 수 있기를 원합니다. 그러나 나는 그들이 새로운 그룹을 만들거나 기존 그룹을 편집 할 수 없도록하고 싶다. 내가 원하는 것은 읽기 전용 중첩 필드입니다. 그러나 read_only=True으로 설정하면 serializer에서 데이터의 유효성을 검사하지 않습니다. read_only=False으로 설정하면 참조를 변경하는 대신 새로운 Group을 생성하려고 시도합니다.DRF의 읽기 전용 중첩 필드 수정

class GroupSerializer(serializers.ModelSerializer): 
    permissions = PermissionSerializer(many=True) 

    class Meta: 
     model = Group 
     fields = (
      'pk', 
      'name', 
      'permissions', 
     ) 

class UserSerializer(serializers.ModelSerializer): 
    groups = GroupSerializer(many=True) 
    .... 

    class Meta: 
     model = User 
     exclude = (
      .... 
     ) 

    def update(self, instance, validated_data): 
     print(validated_data) 
     return instance 

    def validate_groups(self, value): 
     print("validating groups") 
     .... 
     return value 

read_only=True과 전혀 관련이 없습니다. 사용자가 내 PATCH 요청을 받지만 사용자는 정확히 동일합니다. read_only=False으로 나는 또한 GroupSerializer에하지만 변화와 createupdate 방법을 재정의하는 시도 {'groups': [{'name': ['group with this name already exists.']}]}

유효성 검사 오류가 나에게 돌아 얻는다.

최대로 데이터의 그룹이 존재하는지 확인하기 위해 GroupSerializer을 입력해야합니다.

+0

이것은 http://stackoverflow.com/questions/38438167/unique-validation-on-nested-serializer-on-django-rest-framework/과 동일합니다. – Linovia

답변

0

내가 찾은 가장 좋은 해결책은 PrimaryKeyRelatedField을 사용하는 것이며, 이미 존재하는 항목을 선택하고 개체에 연결할 수있는 읽기 전용 인터페이스를 제공합니다.

슬프게도 GET 유형보기에서 해당 객체를 볼 때 관련 객체의 세부 정보가 표시되지 않고 단지 PK 인 단점이 있습니다. 곧이 방법에 대해 알아낼 것입니다. 아마도 멀티 serializer 뷰 세트가 그 트릭을 수행 할 것입니다.

Here are the docs

0

정말 늦게 대답,하지만 난 여기에 StackOverflow에 다른 스레드에서이 우연히 (불행히도 지금은 그것을 찾을 수 없습니다), 그리고 그들은 다음 discussion 언급했다.

필자가 사용한 솔루션은 읽기 용과 쓰기 용의 두 가지 serializer와 정확한 Mixins를 포함하는 두 개의 ViewSets를 만드는 것이 었습니다. 따라서 GET 메서드를 사용할 때는 중첩 된 외래 키를 나열하고 FK 관계의 기존 모델에 대한 식별자를 사용하는 POST 만 나열 할 수 있습니다. 나는 depth 속성을 사용했다. 이 문제와 관련이 있기를 바랍니다.