gpt4 book ai didi

python - 如何使用 Django-rest-framework 创建与模型不同的 View

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:05 26 4
gpt4 key购买 nike

所以,我有这两类服务器和数据中心;

 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

并且想创建一个 View 来返回数据中心的详细信息以及所有相关的服务器,所以现在就做;

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

和我的序列化器;

 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')

如果您想显示两个模型的所有字段,则只需删除“字段”行即可。

这也可以在没有 source 关键字参数的情况下工作,但需要相关名称与“服务器”属性名称相匹配(您可以通过将 related_name='servers' 添加到服务器模型的数据中心字段来实现)。

DRF 的文档非常好,你关心的是 serializer relations

深层网址:

要实现嵌套的 URL 结构,您可以简单地制作一个与上面匹配的 url 模式,如下所示:

url(r'^datacenter/(?P<datacenter_id>\d+)/Servers$', 'views.dc_servers',name="dc_servers")

这将使用数据中心的 ID 作为 kwarg datacenter_id 调用您的 View 。然后,您将使用该 ID 按 datacenter_id 过滤 View 的查询集。

您必须自己研究如何编写该 View ,这里是 views docs让你开始。

几个通用的 Django 技巧:模型通常应该有单数名称而不是复数名称,添加 related_name 参数通常是一件好事(显式优于隐式)。

关于python - 如何使用 Django-rest-framework 创建与模型不同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28281840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com