为两个嵌套的序列化程序更新 Django Rest Framework 中的 Create 方法
Update Create Method in Django Rest Framework for two nested serializers
我找到了很多类似问题的答案,但没有找到我的特定问题的答案。我正在尝试为我的序列化程序更新创建方法,它有两个嵌套序列化程序:
class TaskSerializer(serializers.ModelSerializer):
products = ProductSerializer()
prep = PrepSerializer()
class Meta:
model = Task
fields = '__all__'
def create(self, validated_data):
products_data = validated_data.pop('products')
task = Task.objects.create(**validated_data)
for products_data in products_data:
Product.objects.create(task=task, **products_data)
return task
我也想添加“prep”嵌套序列化程序以同时更新,但我似乎无法正确理解语法。
任何帮助,不胜感激。
它应该可以正常工作,我想你错过了 many=True
。这行得通吗? (假设 and products
和 prep
应该很多)
同时假设您的模型结构如下:
class Task(models.Model)
#fields
class Product(models.Model)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
class Prep(models.Model)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
class TaskSerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)
preps = PrepSerializer(many=True)
class Meta:
model = Task
fields = '__all__'
def create(self, validated_data):
products_data = validated_data.pop('products')
preps_data = validated_data.pop('preps')
task = Task.objects.create(**validated_data)
for products_data in products_data:
Product.objects.create(task=task, **products_data)
for prep_data in preps_data:
Prep.objects.create(task=task, **prep_data)
return task
然后你可以发送这样的请求:
{
"products": [
{"foo": "bar"}
],
"preps": [
{"foo": "bar"}
],
}
我找到了很多类似问题的答案,但没有找到我的特定问题的答案。我正在尝试为我的序列化程序更新创建方法,它有两个嵌套序列化程序:
class TaskSerializer(serializers.ModelSerializer):
products = ProductSerializer()
prep = PrepSerializer()
class Meta:
model = Task
fields = '__all__'
def create(self, validated_data):
products_data = validated_data.pop('products')
task = Task.objects.create(**validated_data)
for products_data in products_data:
Product.objects.create(task=task, **products_data)
return task
我也想添加“prep”嵌套序列化程序以同时更新,但我似乎无法正确理解语法。
任何帮助,不胜感激。
它应该可以正常工作,我想你错过了 many=True
。这行得通吗? (假设 and products
和 prep
应该很多)
同时假设您的模型结构如下:
class Task(models.Model)
#fields
class Product(models.Model)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
class Prep(models.Model)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
class TaskSerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)
preps = PrepSerializer(many=True)
class Meta:
model = Task
fields = '__all__'
def create(self, validated_data):
products_data = validated_data.pop('products')
preps_data = validated_data.pop('preps')
task = Task.objects.create(**validated_data)
for products_data in products_data:
Product.objects.create(task=task, **products_data)
for prep_data in preps_data:
Prep.objects.create(task=task, **prep_data)
return task
然后你可以发送这样的请求:
{
"products": [
{"foo": "bar"}
],
"preps": [
{"foo": "bar"}
],
}