Django REST Framework, Serializers e Nested Fields

355 views
Skip to first unread message

André Brito

unread,
Sep 29, 2015, 3:20:53 PM9/29/15
to django...@googlegroups.com, python-brasil, Lista Python Brasil
Salve galera

To com uma duvida séria aqui. Lendo a documentação do DRF, vi sobre a possibilidade de ter um "nested field" utilizando um Serializer como campo em outro Serializer. Fiz o processo, mas ao fazer uns testes, o Django acusa um erro:


AttributeError: Got AttributeError when attempting to get a value for field `informacoes_geograficas` on serializer `EnteSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Ente` instance.
Original exception text was: 'Ente' object has no attribute 'informacoes_geograficas'.


Pelo q eu entendi, ele busca um campo especifico no meu model, quando deveria consultar o serializer q eu criei.

Vai um gist com o trecho do código ai https://gist.github.com/decko/15156b11687376ecef6f

Valeu
--
André "decko" de Brito
@decko

Paula Grangeiro

unread,
Sep 29, 2015, 4:27:32 PM9/29/15
to Django Brasil, python-brasil, Lista Python Brasil
Olá, André.

Acredito que o problema está na declaração do fields do Meta, onde você declara um field que não existe no modelo (pois é o seu outro serializer).

Att.,

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
"Você é aquilo que você produz."
Paula Grangeiro - www.paulagrangeiro.com.br

decko

unread,
Sep 29, 2015, 5:11:05 PM9/29/15
to django...@googlegroups.com
Tentei tirar ele da declaração ali no fields do Meta, Paula. Mesmo erro. :(
@decko
André F. A. Brito

Lúcio Corrêa

unread,
Sep 29, 2015, 5:13:09 PM9/29/15
to django...@googlegroups.com
Coloca o fonte do Model também.
Lúcio Flávio Corrêa
@luciofcorrea

decko

unread,
Sep 29, 2015, 5:57:53 PM9/29/15
to django...@googlegroups.com

Lúcio Corrêa

unread,
Sep 29, 2015, 6:07:55 PM9/29/15
to django...@googlegroups.com
Nunca usei o DRF, mas pra usar a inner class Meta nesse caso, tua classe deve herdar de serializers.ModelSerializer, não?

Se você não usa um ModelSerializer, não vai usar Meta pra definir os fields. 

Hugo Brilhante

unread,
Sep 29, 2015, 6:15:21 PM9/29/15
to django...@googlegroups.com
Creio que não há necessidade do atributo model da classa Meta de EnteSerializer. Não tenho certeza se o erro é ocasionado por isso mas vale a pena conferir.

Atenciosamente,

Hugo Brilhante
Desenvolvedor Web

    
Móvel TIM:+55 (85)9792-8722

Skype: hugo_brilhante

Aviso de Confidencialidade

Este e-mail (incluindo os anexos) contém informações que podem ser confidenciais. A menos que você seja o destinatário (ou autorizado a receber), você não poderá ler, armazenar ou distribuir a qualquer pessoa a mensagem ou qualquer informação contida nela. Se você a tiver recebido por engano, por favor informe ao remetente, e destrua todas cópias do e-mail original (bem como seus anexos).

Hugo Tácito

unread,
Sep 29, 2015, 6:29:54 PM9/29/15
to django...@googlegroups.com
O problema pode ser na herança pois você está herdando Serializer, quando deveria ser ModelSerializer. Além disso o fields geralmente mapeia os campos da classe de modelo e não do serializer. Acredito que atributos de ModelSerializer's não precisam ser colocados no fields.

Mais exemplos em:

Hugo Brilhante

unread,
Sep 29, 2015, 6:34:39 PM9/29/15
to django...@googlegroups.com
Fiz um teste aqui e funcionou direitinho:

https://gist.github.com/hugobrilhante/f121e44d0ef23de5a771

Atenciosamente,

Hugo Brilhante
Desenvolvedor Web

    
Móvel TIM:+55 (85)9792-8722

Skype: hugo_brilhante

Aviso de Confidencialidade

Este e-mail (incluindo os anexos) contém informações que podem ser confidenciais. A menos que você seja o destinatário (ou autorizado a receber), você não poderá ler, armazenar ou distribuir a qualquer pessoa a mensagem ou qualquer informação contida nela. Se você a tiver recebido por engano, por favor informe ao remetente, e destrua todas cópias do e-mail original (bem como seus anexos).

Hugo Brilhante

unread,
Sep 29, 2015, 6:36:57 PM9/29/15
to django...@googlegroups.com
Imagem inline 1

Atenciosamente,

Hugo Brilhante
Desenvolvedor Web

    
Móvel TIM:+55 (85)9792-8722

Skype: hugo_brilhante

Aviso de Confidencialidade

Este e-mail (incluindo os anexos) contém informações que podem ser confidenciais. A menos que você seja o destinatário (ou autorizado a receber), você não poderá ler, armazenar ou distribuir a qualquer pessoa a mensagem ou qualquer informação contida nela. Se você a tiver recebido por engano, por favor informe ao remetente, e destrua todas cópias do e-mail original (bem como seus anexos).

decko

unread,
Sep 29, 2015, 10:45:53 PM9/29/15
to django...@googlegroups.com
Hugo Britlhante

Como vc chegou a essa solução?

Segui o que todos vcs colocaram aqui:
O primeiro serializer(EnderecoSerializer) herda de ModelSerializer, e passa a conter até a class Meta, declarando o Model e os fields q eu preciso daquele Model.
O segundo serializer herda de Serializer, declara os fields e define o metodo .create() para salvar no banco.

Ainda assim não rolou.

:(

decko

unread,
Sep 29, 2015, 10:53:15 PM9/29/15
to django...@googlegroups.com
Eita, só agora vi seu gist.

Cara, conferi o meu código com o teu e deixei do mesmo jeito.
Por incrivel que pareça, o erro continua. :(


AttributeError: Got AttributeError when attempting to get a value for field `informacoes_geograficas` on serializer `EnteSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Ente` instance.
Original exception text was: 'Ente' object has no attribute 'informacoes_geograficas'.

Hugo Brilhante

unread,
Sep 30, 2015, 8:29:21 AM9/30/15
to django...@googlegroups.com
Dei uma olhada melhor no seus gist e percebi que o que você precisa realmente é só disso:

class EnteSerializers(serializers.ModelSerializer):
         class Meta:
              model=Ente

Nada mais do que isso. Isso vai funcionar perfeitamente e vai te dá o mesmo resultado do print que enviei.


Atenciosamente,

Hugo Brilhante
Desenvolvedor Web

    
Móvel TIM:+55 (85)9792-8722

Skype: hugo_brilhante

Aviso de Confidencialidade

Este e-mail (incluindo os anexos) contém informações que podem ser confidenciais. A menos que você seja o destinatário (ou autorizado a receber), você não poderá ler, armazenar ou distribuir a qualquer pessoa a mensagem ou qualquer informação contida nela. Se você a tiver recebido por engano, por favor informe ao remetente, e destrua todas cópias do e-mail original (bem como seus anexos).

decko

unread,
Sep 30, 2015, 9:59:22 AM9/30/15
to django...@googlegroups.com
Mas se eu não declarar que existe um campo "informacoes_geograficas" que é também um Serializer, como ele vai saber como serializar essas informaçoes todas?

Hugo Brilhante

unread,
Sep 30, 2015, 10:21:58 AM9/30/15
to django...@googlegroups.com
Seu modelo:
class Ente(models.Model):
    id_pub = models.UUIDField(default=uuid.uuid4, editable=False)
    nome = models.CharField(_('Nome'), max_length=100, blank=False)
    endereco = models.TextField(_('Endereço'), blank=True)
    bairro = models.TextField(_('Bairro'), blank=True)
    uf = models.TextField(_('UF'), blank=True)
    cep = models.TextField(_('CEP'), blank=True)

    class Meta:
        verbose_name = "ente"
        verbose_name_plural = "entes"

    def __str__(self):
        return self.nome
Todos os campos que você precisa serializar está no seu modelo. Quando você usa o ModelSerializer o DRF se encarrega de serializar tudo pra você.

Atenciosamente,

Hugo Brilhante
Desenvolvedor Web

    
Móvel TIM:+55 (85)9792-8722

Skype: hugo_brilhante

Aviso de Confidencialidade

Este e-mail (incluindo os anexos) contém informações que podem ser confidenciais. A menos que você seja o destinatário (ou autorizado a receber), você não poderá ler, armazenar ou distribuir a qualquer pessoa a mensagem ou qualquer informação contida nela. Se você a tiver recebido por engano, por favor informe ao remetente, e destrua todas cópias do e-mail original (bem como seus anexos).

Reply all
Reply to author
Forward
0 new messages