Quero serializar um modelo, mas quero incluir um campo adicional que exija que algumas pesquisas de banco de dados na instância do modelo sejam serializadas:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Qual é a maneira certa de fazer isso? Vejo que você pode passar no "contexto" extra para o serializador, é a resposta certa para passar no campo adicional em um dicionário de contexto? Com essa abordagem, a lógica de obter o campo necessário não seria independente da definição do serializador, o que é ideal, pois todas as instâncias serializadas precisarão my_field
. Em outra parte da documentação dos serializadores DRF, diz que "campos extras podem corresponder a qualquer propriedade ou que podem ser chamados no modelo". Campos extras são do que estou falando? Devo definir uma função na Foo
definição de modelo que retorne my_field
valor e, no serializador, conecto meu_campo àquele que pode ser chamado? Como é isso?
Agradecemos antecipadamente, prazer em esclarecer a pergunta, se necessário.
field_name = serializers.SerializerMethodField()
edef get_field_name(self, obj):
foo
quando def um SerializerMethodField? Ao usar CreateAPIView, o foo foi armazenado e pode usar o método is_named_bar ()?Você pode alterar o método do modelo para propriedade e usá-lo no serializador com esta abordagem.
Edit: Com versões recentes do resto framework (eu tentei 3.3.3), você não precisa mudar para propriedade. O método de modelo funcionará bem.
fonte
variable = model_instance.my_field
fornece o mesmo resultado quevariable = model_instance.my_field()
sem o decorador. Também: stackoverflow.com/a/6618176/2198571source='my_field'
não é mais necessário e gera uma exceção #Com a última versão do Django Rest Framework, você precisa criar um método no seu modelo com o nome do campo que deseja adicionar. Não há necessidade
@property
esource='field'
gera um erro.fonte
request
objeto dentro de def foo (self) que possa modificar o valor de foo? (exemplo uma pesquisa baseada request.user)Minha resposta a uma pergunta semelhante ( aqui ) pode ser útil.
Se você tiver um método de modelo definido da seguinte maneira:
Você pode adicionar o resultado da chamada do método mencionado ao serializador da seguinte maneira:
ps Como o campo personalizado não é realmente um campo no seu modelo, você geralmente deseja torná-lo somente leitura, assim:
fonte
se você quiser ler e gravar em seu campo extra, poderá usar um novo serializador personalizado, que estenda os serializadores.Serializador, e use-o assim
eu uso isso em campos aninhados relacionados com alguma lógica personalizada
fonte
Em model.py
**
**
**
fonte
Como o Programador de Produtos Químicos disse neste comentário , na última DRF você pode fazer assim:
Origem dos documentos DRF
fonte