Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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嵌套关系API响应_Python_Django_Python 3.x_Django Rest Framework - Fatal编程技术网

Python Django嵌套关系API响应

Python Django嵌套关系API响应,python,django,python-3.x,django-rest-framework,Python,Django,Python 3.x,Django Rest Framework,我有两种型号District和BTS。我想得到像贝娄一样的回应 [{ "id": 15, "name": "Westen", "page": 1, "expanded": false, "selected": false, "children": [{ "id": 12, "name": "BTS2", "page": 1 }] }, { "id": 13, "name": "

我有两种型号
District
BTS
。我想得到像贝娄一样的回应

[{
    "id": 15,
    "name": "Westen",
    "page": 1,
    "expanded": false,
    "selected": false,
    "children": [{
        "id": 12,
        "name": "BTS2",
        "page": 1
    }]
}, {
    "id": 13,
    "name": "Noth",
    "page": 1,
    "children": [{
        "id": 13,
        "name": "BTS2",
        "page": 2
    }]
}]
我有两个序列化程序

class BTSSerializer(serializers.HyperlinkedModelSerializer):

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.bts_id,
            "page": 4,
            "expanded": False,
            "selected": False,
        }

    class Meta:
        model = BTS
        fields = ('bts_id', 'id')


class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.name,
            "page": 1,
            "expanded": False,
            "selected": False,
            "children": []
        }

    class Meta:
        model = District
        fields = ('name', 'id')
这是BTS模式

class BTS(models.Model):

    id = models.AutoField(primary_key=True)
    bts_id = models.CharField(max_length = 100, unique=True)
    district_id = models.ForeignKey(District, related_name='districts', on_delete=models.CASCADE, null=True)
    bts_type_id = models.ForeignKey(BTSType, related_name='types', on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = "base_stations"

    def __str__(self):
        return self.bts_id
我改变如下

class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    bts = BTSSerializer(many=True)

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.name,
            "page": 1,
            "expanded": False,
            "selected": False,
            "children": value.bts
        }

    class Meta:
        model = District
        fields = ('name', 'id', 'bts')
我怎样才能做到这一点

得到了这个错误

AttributeError at /tree_parents/

'District' object has no attribute 'bts'

Request Method:     GET
Request URL:    http://localhost:8000/tree_parents/
Django Version:     2.2
Exception Type:     AttributeError
Exception Value:    

'District' object has no attribute 'bts'

Exception Location:     /home/samitha/workspace/techlead/tas-test/api/serializers.py in to_representation, line 45

最好查看您的
地区
模型,但您可以尝试以下解决方案:

class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    children = BTSSerializer(source='districts', many=True)
    num_children = serializers.SerializerMethodField()
    page = serializers.SerializerMethodField()
    expanded = serializers.SerializerMethodField()
    selected = serializers.SerializerMethodField()

    def get_page(self, obj):
        return 1
    def get_expanded(self, obj):
        return False
    def get_selected(self, obj):
        return False
    def get_num_children(self, obj):
        return obj.districts.count()

    class Meta:
        model = District
        fields = ('name', 'id', 'children', 'page', 'expanded', 'selected')

最好查看您的
地区
模型,但您可以尝试以下解决方案:

class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    children = BTSSerializer(source='districts', many=True)
    num_children = serializers.SerializerMethodField()
    page = serializers.SerializerMethodField()
    expanded = serializers.SerializerMethodField()
    selected = serializers.SerializerMethodField()

    def get_page(self, obj):
        return 1
    def get_expanded(self, obj):
        return False
    def get_selected(self, obj):
        return False
    def get_num_children(self, obj):
        return obj.districts.count()

    class Meta:
        model = District
        fields = ('name', 'id', 'children', 'page', 'expanded', 'selected')


我已经注意到了。当我将bts添加到字段列表时,它表示bts不在district显示完整的回溯,但如果是这种情况,则错误是不言自明的,将
bts
添加到
district
,检查drf示例again@PetarP我更新了错误。你需要添加
source='bts\u set'
我已经注意到了。当我将bts添加到字段列表时,它表示bts不在district显示完整的回溯,但如果是这种情况,则错误是不言自明的,请将
bts
添加到
district
,检查drf示例again@PetarP我更新了错误。您需要添加
source='bts\u set'
什么是
bts\u set
意思?在尝试获取序列化程序
DistrictSerializer
上的字段
子项的值时,获取了AttributeError。序列化程序字段的名称可能不正确,并且与
District
实例上的任何属性或键都不匹配。原始异常文本为:“District”对象没有属性“bts_set”。请求方法:我希望一个固定的,
\u集
是相关对象的默认名称,但是您设置了
相关的\u名称
,所以应该是
区域
。最好将其更改为bts
。我工作得很好。我想将子对象计数设为父对象。如何获取它?创建模型属性或序列化方法什么是
bts_set
意思?在尝试获取序列化程序
DistrictSerializer
上的字段
子项的值时,获取了AttributeError。序列化程序字段的名称可能不正确,并且与
District
实例上的任何属性或键都不匹配。原始异常文本为:“District”对象没有属性“bts_set”。请求方法:我希望一个固定的,
\u集
是相关对象的默认名称,但是您设置了
相关的\u名称
,所以应该是
区域
。最好将其更改为bts
。我工作得很好。我想将子对象计数设为父对象。我如何获得它?创建模型属性或序列化方法