콘텐츠 유형을 저장하기 위해 "content_type"필드를 사용하고 개체 ID를 저장하기 위해 "object_id"를 사용하는 일반 외래 키를 사용하는 모델이 있습니다. 이 모델은 CRUD API로 조작해야하며 DRF를 사용하고 있습니다. 모델에 대한 serializer가 있지만 약간의 문제가 발생합니다. 난 그냥이DRF에서 GenericForeignKey를 직렬화하는 방법은 무엇입니까?
class MySerializer(ModelSerializer): class Meta: fields = ('name', 'state', 'content_type', 'object_id')
같은 필드 목록에 콘텐츠 _를 추가하면 시리얼 라이저는 ContentType이 모델 인스턴스의 ID로 JSON 표현을 설정합니다. API 사용자는이 ID를 모르고 있기 때문에 ContentType 모델을 아직 또 다른 API로 노출하고 싶지 않습니다. API 사용자는 링크하려는 개체 유형을 알고 있으므로 콘텐츠 형식 이름을 보낼 수 있습니다. 그래서, 나는 이런 serializer를 정의했다.
class MySerializer(ModelSerializer): content_type = serializers.CharField(source="content_type.name") class Meta: fields = ('name', 'state', 'content_type', 'object_id')
모델의 직렬화는 잘 동작한다. User 인스턴스를 연결하기 위해 일반적인 관계를 사용하면 {'name': 'test', 'state': 'NY', 'content_type': 'user', 'object_id': 123}
과 같은 것을 얻을 수 있습니다. 하지만 JSON 구조체로 PUT 또는 POST 요청을 제출하면 DRF는 이것을 {'name': 'test', 'state': 'NY', 'content_type': {'name': {'name': 'user'}}, 'object_id': 123}
과 같은 것으로 변환합니다. 나는 다음과 같이 쓸 수있다
def create(self, validated_data): ct_model = validated_data['content_type']['name']['name'] validated_data['content_type'] = ContentType.objects.get(model=ct_model) return MyModel.objects.create(**validated_data)
그러나 그것은 임의적이고 연약한 것처럼 보인다. 이 상황을 처리하는 올바른 방법은 무엇입니까?
# 1 업데이트: 순간, 나는이 코드
def to_internal_value(self, data): content_type = data.get('content_type', None) validated_data = super().to_internal_value(data) try: validated_data['content_type'] = ContentType.objects.get(model=content_type) except ContentType.DoesNotExist: raise serializers.ValidationError("invalid content type %s" % content_type) return validated_data
그것은 추한 해킹의 일종처럼 보인다와 to_internal_value()를 재정 의하여 문제를 해결 한은을 표시해야합니다 관련 개체.
문서에서 해결책을 찾으셨습니까? http://www.django-rest-framework.org/api-guide/relations/#generic-relationships? – mateuszb
솔루션은 사용자 정의 관련 필드 클래스를 정의하는 것으로 보입니다. 나는 그것을 들여다 볼 것이다. 그러나 그것은 복잡한 것처럼 보인다. –
질문에 대한 답변이 있으시면 답변이 아닌 업데이트로 게시하십시오. –