gpt4 book ai didi

python - 如何使用 rest_framework 和 Django 获取多个对象的响应

转载 作者:太空狗 更新时间:2023-10-30 00:45:26 26 4
gpt4 key购买 nike

我是 Django 框架和 Django REST 框架的新手,但我可以运行基本设置和实现。当我为单个对象调用域时,它就像一个魅力,例如http://mydomain.com/location/1 (其中 1 是主键)。这给了我像这样的 JSON 响应:

{"id": 1, "location": "Berlin", "country": 2}

.. 和 http://mydomain.com/country/2回复如:

{"id": 2, "country": "Germany"}

我需要什么:现在我需要获取多个位置,例如调用域时 http://mydomain.com/all_locations/ .我希望得到这样的回应:

[
{"id": 1, "location": "Berlin", "country": 2},
{"id": 2, "location": "New York", "country": 4},
{"id": 3, "location": "Barcelona", "country": 5},
{"id": 4, "location": "Moscow", "country": 7}
]

这是可选的:在第二步中,我希望在调用 http://mydomain.com/mix_all_locations_countries/ 时在一个响应中包含多个国家和位置。 ,例如:

[
{"locations":
{"id": 1, "location": "Berlin", "country": 2},
{"id": 2, "location": "New York", "country": 4},
{"id": 3, "location": "Barcelona", "country": 5},
{"id": 4, "location": "Moscow", "country": 7}
},
{"countries":
{"id": 1, "country": "Brazil"}
{"id": 2, "country": "Germany"},
{"id": 3, "country": "Portugual"}
{"id": 4, "country": "USA"},
{"id": 5, "country": "Spain"},
{"id": 6, "country": "Italy"}
{"id": 7, "country": "Russia"}
}
]

到目前为止,这是我的实现(仅显示位置的实现):

models.py 中:

class Location(models.Model):
# variable id and pk are always available
location = models.CharField(max_length=100)
country = models.ForeignKey("Country")

serializers.py 中:

class LocationsSerializer(serializers.ModelSerializer):
country_id = serializers.Field(source='country.id')

class Meta:
model = Location
fields = (
'id',
'location',
'country_id',
)

views.py 中:

class LocationAPIView(generics.RetrieveAPIView):
queryset = Location.objects.all()
serializer_class = LocationSerializer

urls.py 中:

url(r'^location/(?P<pk>[0-9]+)/$', views.LocationAPIView.as_view(), name='LocationAPIView')

我的尝试:我认为我不需要修改模型和序列化器,因为它在调用上述域时适用于单个对象。所以我尝试在 views.py 中实现一个 LocationsViewSet 并在 urls.py 中添加一个新的 url,但我失败了。知道我该如何实现吗?也许只是在 LocationAPIView 中定义一个方法并更改定义一个类似于此的 url:

url(r'^all_locations/$', views.LocationAPIView.get_all_locations(), name='LocationAPIView')

提前致谢,如有任何帮助,我将不胜感激。

最好的问候,迈克尔

最佳答案

首先,让我们暂时忘掉 View 集 - 它们使某些事情变得更简单,但它们也引入了一个额外的抽象层,我认为您现在不应该关心它。

您提到的第一件事是需要一个等同于您当前详细信息端点的列表端点。您几乎已经知道了,您只需要在现有 View 旁边引入一个额外的 View 。

views.py:

class LocationListAPIView(generics.ListAPIView):
queryset = Location.objects.all()
serializer_class = LocationSerializer

class LocationDetailAPIView(generics.RetrieveAPIView):
queryset = Location.objects.all()
serializer_class = LocationSerializer

现在在您的 URLconf 中连接两个 View 。

urls.py:

url(r'^location/$', views.LocationListAPIView.as_view(), name='location-list'),
url(r'^location/(?P<pk>[0-9]+)/$', views.LocationDetailAPIView.as_view(), name='location-detail')

请注意,我还更改了 URL 名称样式,使其更符合通常的 Django 约定。

接下来,您需要位置 + 国家/地区的组合 View 。您将不仅能够为此使用现有的通用 View ,因为它是相当自定义的行为,但是为...编写 View 非常容易。

views.py:

class CombinedAPIView(APIView):
def get(self, request):
locations = Location.objects.all()
countries = Country.objects.all()

location_serializer = LocationSerializer(locations, many=True)
country_serializer = CountrySerializer(countries, many=True)

return Response({
'countries': country_serializer.data,
'locations': location_serializer.data
})

并将 View 连接起来。

urls.py:

url(r'^combined/$', views.CombinedAPIView.as_view(), name='combined-list')

请注意,您不需要在生成响应时完全使用序列化器,您也可以在每个实例上提取所有必需的字段,在查看自身,但这是将模型实例映射到数据字典中的一种很好的标准方法。

希望这会给您足够的入门知识。 :)

关于python - 如何使用 rest_framework 和 Django 获取多个对象的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18509087/

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