Tôi đang gặp sự cố khi cập nhật đối tượng lồng nhau.Django-Rest-Framework. Cập nhật đối tượng lồng nhau
Vì vậy, tôi có một mô hình mà cấu trúc tương tự như thế này:
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')
tôi cần phải tạo đối tượng trẻ em từ cha mẹ, và những gì tôi có ý nghĩa bởi đó, là tạo ra InvoiceItems
trực tiếp khi tạo một đối tượng Invoice
. Với mục đích này, tôi đã viết serializers sau:
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
Cho đến nay, tạo/đọc/xóa các phương pháp hoạt động hoàn hảo, ngoại trừ update
. Tôi nghĩ rằng logic dưới đây nên chính xác, nhưng nó bỏ sót điều gì đó.
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
Mọi trợ giúp sẽ thực sự được đánh giá cao.
Có thể bạn sẽ phải chuyển pk như một phần của tải trọng. – dkarchmer
Tôi đang chuyển, nhưng nó không có trong 'validated_data' – dimmg
Bạn có thể hiển thị tải trọng của mình không? – dkarchmer