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.
InformationsquelleAutor dimmg | 2016-05-15