Django-Repos-Cadre. La mise à jour de l'objet imbriqué
Je vais avoir un problème de mise à jour d'un objet imbriqué.
J'ai donc un modèle dont la structure est semblable à celui-ci:
class Invoice(models.Model):
nr = models.CharField(max_length=100)
title = models.CharField(max_length=100)
class InvoiceItem(models.Model):
name = models.CharField(max_length=100)
price = models.FloatField()
invoice = models.ForeignKey(Invoice, related_name='items')
J'ai besoin de créer des objets enfants du parent, et ce que je veux dire par là, est de créer InvoiceItems
directement lors de la création d'un Invoice
objet.
Pour cela, j'ai écrit ce qui suit sérialiseurs:
class InvoiceItemSerializer(serializers.ModelSerializer):
invoice = serializers.PrimaryKeyRelatedField(queryset=Invoice.objects.all(), required=False)
class Meta:
model = InvoiceItem
class InvoiceSerializer(serializers.ModelSerializer):
items = InvoiceItemSerializer(many=True)
class Meta:
model = Invoice
def create(self, validated_data):
items = validated_data.pop('items', None)
invoice = Invoice(**validated_data)
invoice.save()
for item in items:
InvoiceItem.objects.create(invoice=invoice, **item)
return invoice
Jusqu'à présent, le fait de créer/lire/supprimer des méthodes de travail parfaitement, à l'exception de la update
.
Je pense que le dessous de la logique devrait être correct, mais il manque quelque chose.
def update(self, instance, validated_data):
instance.nr = validated_data.get('nr', instance.nr)
instance.title = validated_data.get('title', instance.title)
instance.save()
# up till here everything is updating, however the problem appears here.
# I don't know how to get the right InvoiceItem object, because in the validated
# data I get the items queryset, but without an id.
items = validated_data.get('items')
for item in items:
inv_item = InvoiceItem.objects.get(id=?????, invoice=instance)
inv_item.name = item.get('name', inv_item.name)
inv_item.price = item.get('price', inv_item.price)
inv_item.save()
return instance
Toute aide serait vraiment appréciée.
- Vous allez probablement avoir à passer le pk en tant que partie de la charge utile.
- Je suis de passage, mais il n'est pas présent dans
validated_data
- Pouvez-vous montrer à votre charge?
- voici comment j'ai fais la demande pastie.org/private/3mnrcxp64ra4j65kvcmoyw
- Comment faire pour résoudre le même problème dans Django rest framework 3 parce que la Création d'un ModelSerializer sans les "domaines" de l'attribut ou de la "exclure" de l'attribut a été abandonné depuis 3.3.0.
Vous devez vous connecter pour publier un commentaire.
C'est le chemin que j'ai accompli la tâche:
J'ai ajouté un
id
domaine de laInvoiceItemSerializer
Et la méthode de mise à jour pour le
InvoiceSerializer
Également dans le
create
méthode, je suis éclater laid
si il est passé.DoesNotExist
exception quiinv_item = InvoiceItem.objects.get(id=item_id, invoice=instance)
peut soulever.Je suis tombé sur le même problème récemment. La façon dont j'ai abordé il était de forcer le
id
être un champ obligatoire:De cette façon j'ai pu récupérer le bon exemple et le mettre à jour
create
méthode oùid
est redondant?Dans mon cas, je souhaite mettre à jour toute la liste des objets imbriqués, même si ils sont supprimés.
Je ne veux pas dans tous les imbriquée à la suppression de l'objet, appeler le sous-Modèle de SUPPRIMER la méthode; il suffit de mettre à jour totalité de l'objet et de votre objet imbriqué liste.
Pour cette mise en œuvre: 1-le Produit a N-ProductItems
Essayer
De l'essayer.