Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在包含另一个序列化程序(模型)django rest框架的序列化程序中创建自定义列表字段?_Python_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

Python 如何在包含另一个序列化程序(模型)django rest框架的序列化程序中创建自定义列表字段?

Python 如何在包含另一个序列化程序(模型)django rest框架的序列化程序中创建自定义列表字段?,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我需要在另一个模型序列化程序中使用一个模型序列化程序的列表,我尝试使用SerializerMethodField(),但没有成功。因此我有以下代码: models.py 和serializers.py: 我想要的是: 我现在所拥有的: 您必须更新TyresGroupSerializer,如下所示 class TyresGroupSerializer(serializers.ModelSerializer): tyres = TyreSerializer(source='get_tyres

我需要在另一个模型序列化程序中使用一个模型序列化程序的列表,我尝试使用
SerializerMethodField()
,但没有成功。
因此我有以下代码:

models.py

和serializers.py:

我想要的是:

我现在所拥有的:


您必须更新
TyresGroupSerializer
,如下所示

class TyresGroupSerializer(serializers.ModelSerializer):
    tyres = TyreSerializer(source='get_tyres', many=True)

    def get_tyres(self, instance):
        queryset = Tyre.objects.filter(group=instance)
        return queryset

    class Meta:
        model = TyresGroup
        fields = ['id', 'code', 'brand', 'tyres']

您可以在TyresGroupSerializer中使用SerializerMethodField()字段,如下所示

class TyresSerializer(serializers.ModelSerializer):
    images = ImagesSerializer(many=True)
    tyregroups = serializers.SerializerMethodField(read_only=True) # If you do not want to write data of Tyre object otherwise you can set it to False

    def get_tyregroups(self, instance):
        serializer_class = TyreGroupSerializer(instance.group, many=True)
        serialized_data = serializer_class.data
        return serialized_data

    class Meta:
        model = Tyres
        fields = ['id', 'group', 'images', 'type', 'tyregroups'] # add all other fields which you want to in json

class TyresGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = TyresGroup
        fields = '__all__'

得到了这样一个错误
TypeError在/api/groups/Object的Tyre不是JSON可序列化的
你必须为
Tyre
创建
serializer类
。我已经,上面提到过你正在调用
/api/groups/
,在
TyreGroup
模型中没有
Tyre
的外键,所以,它不会得到
轮胎
对象。但是我的架构是这样做的,因为它不可能移动
轮胎
,它与
图像
轮胎组
相连,上面的模型
TyresGroup
哪个是get:
namererror at/api/groups/name'obj'未定义
在用'obj'get'更改'instance'后:
AttributeError at/api/groups/'TyresGroup'对象没有属性'Tyre'
好的,我认为需要在TyreSerializer()中使用SerializerMethodField()。我会更新答案的。@AbubakrAbduvakhidov刚刚更新了答案。试试这个,然后通过你的api调用TyreSerializer。在/api/tyres/'Tyre'对象上有一个错误
AttributeError没有属性“Tyre”
我刚刚更新了答案。请试试这个。
[
    {
        "id": 1,
        "group": "VH200",
        "brand": "Aventus",
        "tyres": [
            {
                "id": 1,
                "group": 1,
                "images": [...],
                "type": "Л",
                ...etc
            },
            {
                "id": 2,
                "group": 1,
                "images": [...],
                "type": "Л",
                ...etc
            }
        ]
    },
    ...etc
]
[
    {
        "id": 1,
        "group": "VH200",
        "brand": "Aventus"
    },
    {
        "id": 2,
        "group": "VH201",
        "brand": "Columbus"
    }
    ...etc
]
class TyresGroupSerializer(serializers.ModelSerializer):
    tyres = TyreSerializer(source='get_tyres', many=True)

    def get_tyres(self, instance):
        queryset = Tyre.objects.filter(group=instance)
        return queryset

    class Meta:
        model = TyresGroup
        fields = ['id', 'code', 'brand', 'tyres']
class TyresSerializer(serializers.ModelSerializer):
    images = ImagesSerializer(many=True)
    tyregroups = serializers.SerializerMethodField(read_only=True) # If you do not want to write data of Tyre object otherwise you can set it to False

    def get_tyregroups(self, instance):
        serializer_class = TyreGroupSerializer(instance.group, many=True)
        serialized_data = serializer_class.data
        return serialized_data

    class Meta:
        model = Tyres
        fields = ['id', 'group', 'images', 'type', 'tyregroups'] # add all other fields which you want to in json

class TyresGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = TyresGroup
        fields = '__all__'