在 Django REST Framework 中处理不同级别的嵌套
Handling different levels of nesting in Django REST Framework
例如,如果您采用模型:
class Region(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class Company(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
region = models.ForeignKey('Region', db_index=True)
class Staff(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
company = models.ForeignKey('Company', db_index=True)
我知道我不需要在这些模型中包含 id,但我这样做是为了让它更清楚。
在此示例中,有时您可能只想 return 区域列表。其他时候,您可能希望 return 区域列表以及每个区域下每个区域的公司列表。
我想,如果您有区域、他们的公司子级和每个公司的员工子级的列表,您还会想要更多详细信息。
就其余框架视图而言,处理这些不同级别的 depth/detail 的最佳方法是什么。人们通常如何处理这个问题?
我的意思是,当您在顶层说三个视图 return同一件事时,您会使用什么样的命名约定,唯一的区别是它们包含多少层嵌套?
简单地return列出区域
-->在调用时使用带有 many=True 的简单序列化程序(这将 return 字典列表)
class SimpleRegionSerializer(serializers.ModelSerializer):
class Meta:
model = Region
fields = ('id', 'name')
用于获取区域列表以及每个区域下每个区域的公司列表
-->使用嵌套序列化器
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = ('id', 'name')
class NestedRegionSerializer(serializers.ModelSerializer):
company = CompanySerializer(many=True, read_only=True)
class Meta:
model = Region
fields = ('id', 'name')
同时将公司模型更改为
class Company(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
region = models.ForeignKey('Region', db_index=True, related_name='company')
related_name 与 NestedRegionSerializer 中的序列化器字段相同。
不要忘记 运行 迁移或 syncdb
有关详细信息,请参阅 http://www.django-rest-framework.org/api-guide/relations/#nested-relationships 以获取更多参考。
您可以使用任何级别的嵌套,如果需要,您还可以指定 "depth" 作为元选项,它将提供有关嵌套深度的信息。
例如,如果您采用模型:
class Region(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class Company(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
region = models.ForeignKey('Region', db_index=True)
class Staff(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
company = models.ForeignKey('Company', db_index=True)
我知道我不需要在这些模型中包含 id,但我这样做是为了让它更清楚。
在此示例中,有时您可能只想 return 区域列表。其他时候,您可能希望 return 区域列表以及每个区域下每个区域的公司列表。
我想,如果您有区域、他们的公司子级和每个公司的员工子级的列表,您还会想要更多详细信息。
就其余框架视图而言,处理这些不同级别的 depth/detail 的最佳方法是什么。人们通常如何处理这个问题?
我的意思是,当您在顶层说三个视图 return同一件事时,您会使用什么样的命名约定,唯一的区别是它们包含多少层嵌套?
简单地return列出区域
-->在调用时使用带有 many=True 的简单序列化程序(这将 return 字典列表)
class SimpleRegionSerializer(serializers.ModelSerializer):
class Meta:
model = Region
fields = ('id', 'name')
用于获取区域列表以及每个区域下每个区域的公司列表
-->使用嵌套序列化器
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = ('id', 'name')
class NestedRegionSerializer(serializers.ModelSerializer):
company = CompanySerializer(many=True, read_only=True)
class Meta:
model = Region
fields = ('id', 'name')
同时将公司模型更改为
class Company(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
region = models.ForeignKey('Region', db_index=True, related_name='company')
related_name 与 NestedRegionSerializer 中的序列化器字段相同。
不要忘记 运行 迁移或 syncdb
有关详细信息,请参阅 http://www.django-rest-framework.org/api-guide/relations/#nested-relationships 以获取更多参考。
您可以使用任何级别的嵌套,如果需要,您还可以指定 "depth" 作为元选项,它将提供有关嵌套深度的信息。