Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Fazer adições em duas tabelas no banco de dados com 1 request

Salve! Sou iniciante em back-end e em python, Gostaria de saber se a abordagem que estou tendo é a mais eficaz e se realmente da certo, porque até agora não consegui algo solido... mas bem, Estou desenvolvendo em Django REST, algo como um controle de Vendas e Finanças, estou fazendo o POST no bd com a seguinte estrutura:

{                            
"cliente":"Nome do Cliente",
"status":"Aberto",           
"itens:{                     
      "propriedade1":"A",    
      "proprieadde2":"B"     
       }                     
}

Pensando assim, Criei a tabela de vendas e a tabela de itens com uma chave estrangeira relacionando os itens com a venda, e esses são os modelos:

class Venda(models.Model):
    STATUS_CHOICES = [
        ('A', 'Aberto'),
        ('P', 'Pago'),
        ('R', 'Pronto para Retirada'),
        ('E', 'Entrege'),
    ]

    nome = models.CharField(max_length=100)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES)

    def __str__(self):
        return self.nome

class Item(models.Model):
    propriedade1 = models.CharField(max_length=100, blank=True, null=True)
    propriedade2 = models.CharField(max_length=100, blank=True, null=True)
    venda = models.ForeignKey('Venda', related_name='+', on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        item = f"Item.propriedade1:{self.propriedade1},Item.propriedade2:{self.propriedade2}"
        return item

Porem na hora da serialização é que não estou conseguindo pensar em algum jeito... pois para criar uma venda ele me pede um id referente a algum item, e para criar um item ele me pede referencia de uma venda

from rest_framework import serializers
from django.db import transaction
from .models import Venda, Item

class ItemSerializer(serializers.BaseSerializer):

    def to_internal_value(self, data):
        print("internal", data)
        try:
            return Item(**data)
        except:
            self.fail('invalid')
    
    def validate(self, data):
        print("validade",self, data)
        return data

    def to_representation(self, instance):
        print(instance.propriedade1)
        print(instance.propriedade2)
        return {
            "propriedade1": instance.propriedade1,
            "propriedade2": instance.propriedade2
        }
        

    def create(self, validated_data):
        print('item:', validated_data)
        return  Item.objects.create(**validated_data)


class VendaSerializer(serializers.ModelSerializer):
    itens = ItemSerializer(many=True)

    class Meta:
        model = Venda
        fields = ('nome', 'status', 'itens')

    
    def to_internal_value(self, data):
        itens = data.pop('itens')[0]
        item = Item.objects.create(**itens)
        print("internal venda", data, type(data), item)
        try:
            return data
        except:
            self.fail('invalid')

    def create(self, validated_data):
        print("create venda", validated_data, type(validated_data))
        venda = Venda(**validated_data)
        print(venda, type(venda))
        return venda

por enquanto é isso que eu consegui chegar (porem ele não me devolver oque eu realmente quero) tentei estudar um pouco do cliclo de serealização do Django porém não consegui chegar em algo que me clareie de como deveria ser

Teria algum jeito de forçar a criação de algum dos dois primeiro e depois fazer um put em algum dos dois para adicionar os ids referentes de cada?

1 resposta
solução!

Consegui Solucionar o Erro... No caso o erro nem era no código mesmo... com varias migrações feitas e acho que também por estar usando sqlite, em algumas das migrações o bd acabou não deletando o campo Venda.itens sendo assim ele nescessário para ser salvo mesmo ele não constando no models ele constava no db.