Criei um ModelSerializer
e desejo adicionar um campo personalizado que não faz parte do meu modelo.
Encontrei uma descrição para adicionar campos extras aqui e tentei o seguinte:
customField = CharField(source='my_field')
Quando adiciono este campo e chamo minha validate()
função, então este campo não faz parte do attr
dicionário. attr
contém todos os campos do modelo especificados, exceto os campos extras. Portanto, não posso acessar este campo na minha validação de sobrescrita, posso?
Quando adiciono este campo à lista de campos assim:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
então recebo um erro porque customField
não faz parte do meu modelo - o que é correto porque eu quero adicioná-lo apenas para este serializador.
Existe alguma maneira de adicionar um campo personalizado?
Respostas:
Você está fazendo a coisa certa, exceto que
CharField
(e os outros campos digitados) são para campos graváveis.Nesse caso, você deseja apenas um campo somente leitura simples, então, em vez disso, use:
fonte
.validate()
método para remover o atributo. Veja: django-rest-framework.org/api-guide/serializers.html#validation Isso faria o que você precisa, embora eu realmente não entenda o caso de uso, ou porque você quer um campo gravável que está vinculado a um propriedade somente leituraget_absolute_url
?get_absolute_url
que acabei de copiar e colar dos documentos. Eu só quero um campo gravável normal que posso acessar novalidate()
. Acabei de adivinhar que precisaria dosource
atributo ...Na verdade, existe uma solução sem tocar em todo o modelo. Você pode usar o
SerializerMethodField
qual permite conectar qualquer método ao serializador.fonte
SerializerMethodField
não é... para maior clareza, se você tiver um Método de Modelo definido da seguinte maneira:
Você pode adicionar o resultado da chamada do referido método ao serializador da seguinte maneira:
ps Uma vez que o campo personalizado não é realmente um campo em seu modelo, você geralmente deseja torná-lo somente leitura, assim:
fonte
perform_create(self, serializer)
,perform_update(self, serializer)
,perform_destroy(self, instance)
.aqui responda para sua pergunta. você deve adicionar à sua conta modelo:
agora você pode usar:
fonte: https://stackoverflow.com/a/18396622/3220916
fonte
Para mostrar
self.author.full_name
, recebi um erro comField
. Funcionou comReadOnlyField
:fonte
Com a última versão do Django Rest Framework, você precisa criar um método em seu modelo com o nome do campo que deseja adicionar.
fonte
Eu estava procurando uma solução para adicionar um campo personalizado gravável a um serializador de modelo. Encontrei este, que não foi abordado nas respostas a esta pergunta.
Parece que você realmente precisa escrever seu próprio serializador simples.
Agora você pode usar este Serializer para adicionar campos personalizados a um ModelSerializer
Isso também funciona, se o modelo
MyModel
realmente tiver uma propriedade chamada,my_custom_field
mas você deseja ignorar seus validadores.fonte
Depois de ler todas as respostas aqui, minha conclusão é que é impossível fazer isso de forma limpa. Você tem que jogar sujo e fazer algo horrível, como criar um campo write_only e, em seguida, substituir os métodos
validate
eto_representation
. Isto é o que funcionou para mim:fonte