我正在使用Django Rest Framework构建API。我想发布一个 takeoutOrder JSON对象,如下所示:
{
"takeoutOrderID": "001",
"components": [
{
"name": "chicken",
"componentID": 1
},
{
"name": "beef",
"componentID": 2
},
{
"name": "rice",
"componentID": 3
},
{
"name": "carrot",
"componentID": 4
}
],
"meals": [
{
"name": "chickenAndRice",
"mealID": 00,
"components": [1,3]
},
{
"name": "kitchenSink",
"mealID": 01,
"components": [1,2,3,4]
}
]
}
我的模型如下所示:
class TakeoutOrder(models.Model):
requestID = models.CharField(max_length=100, primary_key=True)
def get_absolute_url(self):
return "/api/request/%s/" % self.requestID
class Meal(models.Model):
name = models.CharField(max_length=100, blank=True, default='')
mealID = models.CharField(max_length=100, primary_key=True)
takeoutOrder = models.ForeignKey(TakeoutOrder, related_name="meals")
class Component(models.Model):
name = models.CharField(max_length=100)
componentID = models.CharField(max_length=100, primary_key=True)
takeoutOrder = models.ForeignKey(TakeoutOrder, related_name='components')
meal = models.ForeignKey(Meal, related_name='components', null=True)
我的序列化工具如下所示:
class ComponentSerializer(serializers.ModelSerializer):
class Meta:
model = Component
fields = ('name', 'componentID')
class MealSerializer(serializers.ModelSerializer):
components = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Meal
fields = ('name', 'mealID', 'components')
class TakeoutOrderSerializer(serializers.ModelSerializer):
components = ComponentSerializer(many=True)
meals = MealSerializer(many=True)
class Meta:
model = TakeoutOrder
fields = ('takeoutOrderID', 'components', 'meals')
def create(self, validated_data):
components_data = validated_data.pop('components')
meals_data = validated_data.pop('meals')
takeoutOrder = TakeoutOrder.objects.create(**validated_data)
for meal_data in meals_data:
Meal.objects.create(takeoutOrder=takeoutOrder, **meal_data)
for component_data in components_data:
Component.objects.create(takeoutOrder=takeoutOrder, **component_data)
return takeoutOrder
当我尝试使用此设置发布到 / takeoutOrder 端点时,我成功创建了一个对象,但是饭菜组件数组是空的(我相信这是因为组件还没有在创建膳食时创建)。有关如何更好地编写序列化create()方法或任何其他建议的任何想法?我有点卡住了。
如果还有其他帖子回答这个问题,请提前道歉,我找了一会儿,却找不到一个。
谢谢!
答案 0 :(得分:0)
首先:我认为这些模型是错误的。
因为:您将创建多个组件,因为您只需要一个关联。
更改模型组件:
class Component(models.Model):
name = models.CharField(max_length=100)
componentID = models.CharField(max_length=100, primary_key=True)
添加新模型:
class MealComponent(models.Model):
meal = models.ForeignKey(Meal)
component = models.ForeignKey(Component)
然后:
def create(self, validated_data):
components_data = validated_data.pop('components')
meals_data = validated_data.pop('meals')
takeoutOrder = TakeoutOrder.objects.create(**validated_data)
for component_data in components_data:
Component.objects.create(**component_data)
for meal_data in meals_data:
meal_data.update({'takeoutOrder':takeoutOrder}
meal = Meal.objects.create(**meal_data)
meal_components = meal_data.pop('components')
for meal_comp in meal_components:
component = Component.objects.get(pk=meal_comp)
MealComponent.objects.create(meal=meal,component=component)
return takeoutOrder