1
resposta

Delegando acesso a atributos do Usuário através do @property

Estou com dúvida no seguinte trecho retirado da aula:

O problema é que a classe User já possui o atributo email. A solução é apagar o atributo da classe e delegar seu acesso para a classe User. Mas como faremos essa delegação? Adicionaremos uma propriedade (@property) em nossa classe:

from django.db import models

class Perfil(models.Model):

    nome = models.CharField(max_length=255, null=False)
    #sem email
    telefone = models.CharField(max_length=15, null=False)
    nome_empresa = models.CharField(max_length=255, null=False)

    contatos = models.ManyToManyField('self')

    usuario = models.OneToOneField(User, related_name="perfil")

    @property
    def email(self):
        return self.usuario.email

# código posterior comentado

Ora, User também possui o atributo nome, porque não fazer o mesmo para esta propriedade?A verdade é que não entendi bem este passo. User e Perfil já estão relacionados, através do models.OneToOneField. Fazemos isto apenas para não guardar dados duplicados no Data Base, ou tem algum outro motivo?

1 resposta

Oi Hiago, como você está? Espero que esteja bem ^-^

User e Perfil possuem o relacionamento um para um, porém, tínhamos tanto em User quanto em Perfil o atributo e-mail e para evitar e-mails duplicados, excluímos o atributo e-mail na classe Perfil e passaremos a utilizar o e-mail da classe User, por isso na property retornamos: self.usuario.email. A ideia geral é que um usuário tenha um perfil, logo, eles compartilham o mesmo e-mail. Tudo bem?

Qualquer dúvida é só falar, estou à disposição. Abraços e bons estudos!