Atribuição de chave estrangeira com serializadores aninhados no Django REST Framework
Django REST Framework (DRF) fornece uma maneira conveniente de gerenciar relacionamentos de chave estrangeira em dados serializados. No entanto, obter o comportamento desejado em serializadores aninhados pode ser um desafio.
Atribuição de chave estrangeira em serializadores aninhados
Serializadores aninhados herdam o comportamento de seus serializadores pais. Por padrão, eles não permitem atribuição direta ou modificação de chaves estrangeiras. Para superar isso, uma abordagem comum é especificar um campo adicional para o ID da chave estrangeira. No entanto, isso pode levar a um desenvolvimento front-end ambíguo.
Soluções Alternativas
1. Método to_representation() personalizado:
Uma solução é substituir o método to_representation() do serializador pai. Isso permite a inclusão de dados personalizados na resposta serializada.
def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
Essa abordagem garante que a chave estrangeira seja representada como um objeto serializador aninhado, permitindo a criação e a leitura usando a mesma chave.
2. Campo RelatedFieldAlternative:
Uma solução mais genérica é criar um campo serializador personalizado que se comporte de maneira diferente do PrimaryKeyRelatedField padrão.
class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def to_representation(self, instance): if self.serializer: return self.serializer(instance, context=self.context).data return super().to_representation(instance)
Este campo permite especificar um serializador para a representação da chave estrangeira.
Usando o campo RelatedFieldAlternative
O campo RelatedFieldAlternative pode então ser usado no serializador pai da seguinte forma:
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)
Benefícios de usar o campo personalizado
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3