如何创建比Django的REST的架构模型不同的视点(How do I create a view

2019-10-21 17:53发布

所以,我有这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

有什么建议么?

Answer 1:

嵌套服务器:

如果你想(几乎)正是你给了作为样本的输出,那么这将是这样的:

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参数通常是一件好事(明确了隐含的)。



Answer 2:

为了展示,你可以做到这一点在串行的服务器:

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/



Answer 3:

感谢你们为您解答,最后都是我所要做的就是添加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/



文章来源: How do I create a view different than the model with Django-rest-framework