所以,我有这2类服务器和数据中心的;
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Servers(models.Model):
datacenter = models.ForeignKey(Datacenter)
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
而想要创建一个返回数据中心的详细信息,以及所有相关的服务器视图,所以现在当我做;
http://127.0.0.1:8000/datacenter/1/
我得到的东西等;
{
"id": 1,
"name": "TestDC"
}
但是实际上,我希望得到的是这样的;
{
"id": 1,
"name": "TestDC",
"Servers": [
{
"id": 1,
"hostname": "Server1",
},
{
"id": 2,
"hostname": "Server2",
}
]
}
现在我的看法是这样的;
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = datacenter.objects.all()
serializer_class = datacenterSerializer
我serialiazer;
class DatacenterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Datacenter
fields = ('id','name')
我也想拥有像其他方法服务器列表;
http://127.0.0.1:8000/datacenter/1/Servers
有什么建议么?
嵌套服务器:
如果你想(几乎)正是你给了作为样本的输出,那么这将是这样的:
class ServersSerializer(serializers.ModelSerializer):
class Meta:
model = Servers
fields = ('id', 'hostname')
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServersSerializer(source='servers_set')
class Meta:
model = Datacenter
fields = ('id', 'name')
如果你想显示两种型号的所有字段,然后刚落“领域”行。
这也可以工作,没有源关键字参数,但需要相关的名称相匹配的“服务器”属性名(你可以通过添加related_name =“服务器”到数据中心领域的服务器模型做到这一点)。
对于DRF该文档是相当不错的,你所关心的位串行关系
深网址:
为了实现嵌套URL结构,你可以简单地做出符合以上条件,像这样的URL模式:
url(r'^datacenter/(?P<datacenter_id>\d+)/Servers$', 'views.dc_servers',name="dc_servers")
这将调用与数据中心的ID作为kwarg视图datacenter_id
。 然后,您可以使用该ID以滤除datacenter_id视图的查询集。
你必须考虑如何编写看待自己,这里有意见的文档 ,让你开始。
一对夫妇的一般的Django提示:模型应该通常有奇异的名字,而不是复数,加入related_name参数通常是一件好事(明确了隐含的)。
为了展示,你可以做到这一点在串行的服务器:
class DatacenterSerializer(serializers.HyperlinkedModelSerializer):
servers = serializers.HyperlinkedRelatedField(
many=True
)
class Meta:
model = Datacenter
fields = ('id','name', 'servers')
如果你想显示服务器的几个领域,你应该创建要显示,然后替换行领域的ServerSerializer:
servers = serializers.HyperlinkedRelatedField(
many=True
)
附:
servers = ServerSerializer(many=True)
欲了解更多信息,看看在文档: http://www.django-rest-framework.org/api-guide/relations/
感谢你们为您解答,最后都是我所要做的就是添加related_name模型,现在它看起来像这样;
类数据中心(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
级服务器(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
关于深URL,我被检查的文件,它应该可以使用SimpleRouter来完成,但找不到任何的例子来看看如何实现它; {前缀} / {查找} / {方法名} /
http://www.django-rest-framework.org/api-guide/routers/