2015-04-28 32 views
4

筑巢。例如,如果你把型号:处理不同层次的Django的REST框架

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,但我这样做,使它更清晰。

在这个例子中,有时候你只想返回一个Regions列表。其他时候,您想要返回一个区域列表,并在每个区域下列出每个区域的公司名单。

我想你还想知道更多的细节,你有哪些地区,他们的公司孩子以及每个公司的员工孩子。

就其他框架视图而言,处理这些不同级别的深度/细节的最佳方式是什么。人们通常如何处理这个问题?

这是我的意思,当你说三个视图在顶层返回相同的东西时,你会使用什么样的命名约定,唯一的区别是它们包含多少层嵌套?

回答

2

只返回列表区域

- >使用简单串行器与多=真在调用它(这个字典将返回列表)

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更多的参考。

您可以使用任何级别的嵌套,如果您想要,还可以指定“深度”作为元选项,它将提供有关嵌套深度的信息。

+0

非常感谢!如果我有几个不同级别的深度可用,你会如何命名这些命令,但最终是返回Region对象?我会有三个不同的序列化程序,如RegionBaseSerializer,RegionWithCompanySerializer,RegionWithCompanyAndStaffSerializer? – Smills

+1

是的。这是正确的。您也可以像使用RegionBaseSerializer那样使用继承,您可以使用所有常用属性定义它。并重复使用所有不同的属性。 – NehaG