Python Django REST框架-嵌套对象列表之间的关系

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}

我在网上找不到这个问题的答案。也就是说,我对构建RESTAPI还不熟悉,可能做了一些根本不正确的事情

我想做的是发布一个JSON对象,其特征如下:

{
"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,我要把这个告诉你们。我肯定你会遇到很多问题,但我真的在努力解决这个问题。任何帮助都将不胜感激!