1. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[Python] Python Django herança com atributo unique

Discussão em 'Python' iniciado por Stack, Outubro 1, 2024 às 08:22.

  1. Stack

    Stack Membro Participativo

    estou com um pequeno problema.

    class Pessoa(models.Model):
    cpf = BRCPFField(**unique=true**)

    class Aluno(Pessoa):
    novo_atributo = ....

    class Instrutor(Aluno):
    outro_atributo = ...

    class Gestor(Pessoa):
    class Meta:
    proxy = True


    Uma pessoa pode ser um aluno, um gestor e um aluno pode se tornar um instrutor, futuramente.

    Quando eu cadastro um aluno com um CPF X, 100%. Mas quando eu tento registrar esse mesmo aluno(pessoa) com o CPF X como gestor, acusa erro pois o CPF está como unique. Como posso resolver isso?

    Já tentei deixar a classe Pessoa como abstrata, porém o eu quero é deixar a tabela pessoa única, para evitar duplicidade. Pois uma mesma pessoa pode ser gestor, aluno e instrutor. Pensei na herança, pois ajuda bastante em relação ao banco.

    Forms:

    class PessoaForm(forms.ModelForm):
    class Meta:
    model = Pessoa
    fields = '__all__'


    class GestorForm(PessoaForm):
    class Meta:
    model = Gestor
    fields = '__all__'


    class AlunoForm(PessoaForm):
    class Meta:
    model = Aluno
    fields = '__all__'


    Views:

    class AlunoCreate(LoginRequiredMixin, CreateView):
    model = Aluno
    form_class = AlunoForm
    login_url = reverse_lazy('usuarios:login')


    class GestorCreate(LoginRequiredMixin, CreateView):
    model = Gestor
    login_url = reverse_lazy('usuarios:login')
    form_class = GestorForm


    Template Aluno_form:

    <form class="row gx-3 gy-2 align-items-center needs-validation" method="post" action=""
    role="form" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.media }}
    <div class="row g-3">
    <div class="col-md-3">
    <div class="form-floating">
    {{ form.cpf }}
    <label for="id_cpf">CPF</label>
    </div>
    </div>
    <div class="col-md-6">
    <div class="form-floating">
    {{ form.nome }}
    <label for="id_nome">Nome</label>
    </div>
    </div>
    </div>
    <div class="col-auto">
    <button type="submit" class="btn btn-primary mb-2">Enviar</button>
    </div>
    </form>


    Template Gestor_form:

    <form class="row gx-3 gy-2 align-items-center needs-validation" method="post" action=""
    role="form" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.media }}
    <div class="row g-3">
    <div class="col-md-3">
    <div class="form-floating">
    {{ form.cpf }}
    <label for="id_cpf">CPF</label>
    </div>
    </div>
    <div class="col-md-6">
    <div class="form-floating">
    {{ form.nome }}
    <label for="id_nome">Nome</label>
    </div>
    </div>
    <div class="col-md-6">
    <div class="form-floating">
    {{ form.funcao }}
    <label for="id_nome">Função</label>
    </div>
    </div>
    </div>
    <div class="col-auto">
    <button type="submit" class="btn btn-primary mb-2">Enviar</button>
    </div>
    </form>

    Continue reading...

Compartilhe esta Página