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
。我工作得很好。我想将子对象计数设为父对象。我如何获得它?创建模型属性或序列化方法