TransWikia.com

Como fazer update "deletando" objetos de um objeto aninhado?

Stack Overflow em Português Asked by Antonio Braz Finizola on January 2, 2021

Tenho esses dois models a seguir:

class Questionario(models.Model):
    numero = models.IntegerField()
    nome = models.CharField(max_length=300)

    class Meta:
        db_table = 'questionario'
        verbose_name = u'Questionario'
        verbose_name_plural = u'Questionarios'


class Pergunta(models.Model):
    ask = models.CharField(max_length=200)
    questionario = models.ForeignKey(Questionario, related_name='questionario', on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = 'pergunta'
        verbose_name = u'Pergunta'
        verbose_name_plural = u'Perguntas'

Há um relacionamento de 1~N, onde para 1 Questionario tem-se N Perguntas. Estou tentando criar uma view de update que seja capaz de remover as perguntas caso elas não venham no payload.

Por exemplo:

{
    "id": 1,
    "numero": 1,
    "nome": "Perfil comportamental e preferência cerebral",
    "perguntas": [
      {
        "id": 1,
        "ask": "Eu sou..."
      },
      {
        "id": 2,
        "ask": "Eu estou..."
      }
    ]
}

O objeto acima está no banco atualmente. Quero que quando eu fornecer ele assim:

{
    "id": 1,
    "numero": 1,
    "nome": "Perfil comportamental e preferência cerebral",
    "perguntas": [
        {
            "id": 2,
            "ask": "Eu estou..."
        }
    ]
}

o objeto pergunta com id=1 seja removido e reste apenas o objeto pergunta com id=2.

Esse é o meu método de update atual:

def update(self, instance, validated_data):
    instance.numero = validated_data.get('numero', instance.numero)
    instance.nome = validated_data.get('nome', instance.nome)
    instance.save()
    perguntas = validated_data.get('questionario')

    for pergunta in perguntas:
        id_pergunta = pergunta.get('id', None)
        if id_pergunta:
            perguntaBD = Pergunta.objects.get(id=id_pergunta, questionario=instance)
            perguntaBD.ask = pergunta.get('ask', perguntaBD.ask)
            perguntaBD.save()
        else:
            pergunta = Pergunta(**pergunta)
            pergunta.questionario = instance
            pergunta.save()
    return instance

Grato pela ajuda.

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP