我正在Django中构建一个应用程序。
我正在开发一个API服务视图,该视图返回存储在我的模型中的城市列表,其中包含它们的功能:
def cities_list_api(request):
cities = target_area_input_data.objects.all()
data = {"cities":list(cities.values("pk","Name","Longitude","Latitude","Radius"))}
response = JsonResponse(data)
return response
返回:
{quot;城市":[{quotquot;pk"2,"名称":"罗马","经度":12.49,"纬度:41.89;半径":10.5},{"pk":6,"Name":"河内,越南"经度:105.84;纬度:21.02;半径":10.0},{"pk":1,"名称":"米兰","经度":9.19,"纬度":45.46:5.5},{"pk":4,"名称":"维罗纳","经度":10.97,"纬度:45.41;半径":4.5},{"pk":5,"Name":"pszczyna,Polonia"经度:18.93;纬度:49.98;半径":3.0}]}
看在shoness的份上,我可以写同样的视图,比如:
def cities_list_api(request):
cities = target_area_input_data.objects.all()
data = {"cities":list(cities.values())}
response = JsonResponse(data)
return response
这样我就不必把所有字段都写在values()
括号内。
现在,我正在开发一个API服务视图,该视图返回给定城市id的城市特征。
def city_detail_api(request, pk):
try:
city = target_area_input_data.objects.get(pk=pk)
data = {
"city":
{
"pk":city.pk,
"Name":city.Name,
"Longitude":city.Longitude,
"Latitude":city.Latitude,
"Radius":city.Radius,
}
}
response = JsonResponse(data)
return response
返回:
{"城市":{"pk":2,"名称":"罗马","经度":12.494757,"纬度":41.892786,"半径":10.5}}
我只想在字典中显示所需实例的所有属性,该字典保存在字典键city
中,因此,为了简洁起见,我想将该视图更改为以下视图:
def city_detail_api(request, pk):
try:
city = target_area_input_data.objects.get(pk=pk)
data = {
"city":right_expression
}
response = JsonResponse(data)
return response
right_expression
应该是什么?
即使这次我怎么能避免写所有的字段呢?
我会使用DRF序列化程序来实现这一点,例如:
from rest_framework import serializers
class CitySerializer(serializers.ModelSerializer):
class Meta:
fields = (
"id",
"name"
"longitud",
)
model = City
然后在视图中:
def city_detail_api(request, pk):
city = target_area_input_data.objects.get(pk=pk)
data = dict(city=CitySerializer(city).data)
response = JsonResponse(data)
return response
我认为使用DRF是一种更标准的方法,它让您有机会解析序列化程序中的一些计算字段,还嵌套了另一个序列化程序,最终您将拥有DRF序列化程序的所有功能。