Python Django REST框架-嵌套对象列表之间的关系
我在网上找不到这个问题的答案。也就是说,我对构建RESTAPI还不熟悉,可能做了一些根本不正确的事情 我想做的是发布一个JSON对象,其特征如下:Python Django REST框架-嵌套对象列表之间的关系,python,json,django,rest,Python,Json,Django,Rest,我在网上找不到这个问题的答案。也就是说,我对构建RESTAPI还不熟悉,可能做了一些根本不正确的事情 我想做的是发布一个JSON对象,其特征如下: { "groceryStoreVisit": 100, "fruits": [ {"id":10, "type":"apple", "quantity":4}, {"id":20, "type":"orange", "quantity":3}, {"id":30, "type":"banana", "quantity":6}
{
"groceryStoreVisit": 100,
"fruits": [
{"id":10, "type":"apple", "quantity":4},
{"id":20, "type":"orange", "quantity":3},
{"id":30, "type":"banana", "quantity":6}
],
"nuts": [
{"id":40, "type":"cashew", "no_bags":2},
{"id":50, "type":"peanut", "no_bags":4}
],
"bags": [
{"id":0, "type":"paper", "contents":[10,20,30]},
{"id":1, "type":"plastic", "contents":[40,50]}
]}
class BagSerializer(serializers.ModelSerializer):
contents = serializers.SlugRelatedField(many=True, queryset=Fruit.objects.all(), slug_field='id')
class Meta:
model = Bag
fields = ('id', 'type', 'contents')
class GroceryStoreVisitSerializer(serializers.ModelSerializer):
fruits = FruitSerializer(many=True)
bags = BagSerializer(many=True)
class Meta:
model = GroceryStoreVisit
fields = ('groceryStoreVisit', 'fruits', 'nuts', 'bags')
def create(self, validated_data):
fruits_data = validated_data.pop('fruits')
nuts_data = validated_data.pop('nuts')
bags_data = validated_data.pop('bags')
groceryStoreVisit = GroceryStoreVisit.objects.create(**validated_data)
for fruit_data in fruits_data:
Fruit.objects.create(groceryStoreVisit=groceryStoreVisit, **fruit_data)
for nut_data in nuts_data:
Nut.objects.create(groceryStoreVisit=groceryStoreVisit, **nut_data)
for bag_data in bags_data:
Bag.objects.create(groceryStoreVisit=groceryStoreVisit, **bag_data)
return groceryStoreVisit
我的问题是,在尝试序列化数据时,会出现如下错误:
{“bags”:[{“fruits”:[“id=10的对象不存在。”]}]}
我的包序列化类如下所示:
{
"groceryStoreVisit": 100,
"fruits": [
{"id":10, "type":"apple", "quantity":4},
{"id":20, "type":"orange", "quantity":3},
{"id":30, "type":"banana", "quantity":6}
],
"nuts": [
{"id":40, "type":"cashew", "no_bags":2},
{"id":50, "type":"peanut", "no_bags":4}
],
"bags": [
{"id":0, "type":"paper", "contents":[10,20,30]},
{"id":1, "type":"plastic", "contents":[40,50]}
]}
class BagSerializer(serializers.ModelSerializer):
contents = serializers.SlugRelatedField(many=True, queryset=Fruit.objects.all(), slug_field='id')
class Meta:
model = Bag
fields = ('id', 'type', 'contents')
class GroceryStoreVisitSerializer(serializers.ModelSerializer):
fruits = FruitSerializer(many=True)
bags = BagSerializer(many=True)
class Meta:
model = GroceryStoreVisit
fields = ('groceryStoreVisit', 'fruits', 'nuts', 'bags')
def create(self, validated_data):
fruits_data = validated_data.pop('fruits')
nuts_data = validated_data.pop('nuts')
bags_data = validated_data.pop('bags')
groceryStoreVisit = GroceryStoreVisit.objects.create(**validated_data)
for fruit_data in fruits_data:
Fruit.objects.create(groceryStoreVisit=groceryStoreVisit, **fruit_data)
for nut_data in nuts_data:
Nut.objects.create(groceryStoreVisit=groceryStoreVisit, **nut_data)
for bag_data in bags_data:
Bag.objects.create(groceryStoreVisit=groceryStoreVisit, **bag_data)
return groceryStoreVisit
我的GroceryStoreVisit(整个对象)序列化类如下所示:
{
"groceryStoreVisit": 100,
"fruits": [
{"id":10, "type":"apple", "quantity":4},
{"id":20, "type":"orange", "quantity":3},
{"id":30, "type":"banana", "quantity":6}
],
"nuts": [
{"id":40, "type":"cashew", "no_bags":2},
{"id":50, "type":"peanut", "no_bags":4}
],
"bags": [
{"id":0, "type":"paper", "contents":[10,20,30]},
{"id":1, "type":"plastic", "contents":[40,50]}
]}
class BagSerializer(serializers.ModelSerializer):
contents = serializers.SlugRelatedField(many=True, queryset=Fruit.objects.all(), slug_field='id')
class Meta:
model = Bag
fields = ('id', 'type', 'contents')
class GroceryStoreVisitSerializer(serializers.ModelSerializer):
fruits = FruitSerializer(many=True)
bags = BagSerializer(many=True)
class Meta:
model = GroceryStoreVisit
fields = ('groceryStoreVisit', 'fruits', 'nuts', 'bags')
def create(self, validated_data):
fruits_data = validated_data.pop('fruits')
nuts_data = validated_data.pop('nuts')
bags_data = validated_data.pop('bags')
groceryStoreVisit = GroceryStoreVisit.objects.create(**validated_data)
for fruit_data in fruits_data:
Fruit.objects.create(groceryStoreVisit=groceryStoreVisit, **fruit_data)
for nut_data in nuts_data:
Nut.objects.create(groceryStoreVisit=groceryStoreVisit, **nut_data)
for bag_data in bags_data:
Bag.objects.create(groceryStoreVisit=groceryStoreVisit, **bag_data)
return groceryStoreVisit
我不确定这些信息是否足以说明我正在努力实现的目标。模型或水果/坚果序列化器没有什么异国情调。请让我知道,如果有什么我可以澄清,使问题的定义更容易理解
我想验证行李内容是否存在于顶级GroceryStoreVisit对象中。我能做我想做的吗
谢谢你的帮助
SlugRelatedField
尝试在您有机会创建匹配的对象之前查找它们。这发生在to_internal_value()
中,在create()
之前调用该函数以获取已验证的_数据。contents
部分引用现有的结果还是仅引用当前消息的一部分?目前,我只需要contents
部分引用当前消息的结果。最后,我希望允许内容引用当前消息的现有内容或部分内容,但现在没有优先级。@dhke是否有方法重写to_internal_value()
方法?我倾向于避免和高级机械师打交道,但我想知道对于这种特殊情况是否有一个聪明的解决方案。@TomChristie,我要把这个告诉你们。我肯定你会遇到很多问题,但我真的在努力解决这个问题。任何帮助都将不胜感激SlugRelatedField
在您有机会创建匹配的Fruit
对象之前尝试查找它们。这发生在to_internal_value()
中,在create()
之前调用该函数以获取已验证的_数据。contents
部分引用现有的结果还是仅引用当前消息的一部分?目前,我只需要contents
部分引用当前消息的结果。最后,我希望允许内容引用当前消息的现有内容或部分内容,但现在没有优先级。@dhke是否有方法重写to_internal_value()
方法?我倾向于避免和高级机械师打交道,但我想知道对于这种特殊情况是否有一个聪明的解决方案。@TomChristie,我要把这个告诉你们。我肯定你会遇到很多问题,但我真的在努力解决这个问题。任何帮助都将不胜感激!