【问题标题】:How to turn fields and values of a model object into keys and values of a dictionary如何将模型对象的字段和值转换为字典的键和值
【发布时间】:2020-05-06 14:35:53
【问题描述】:

我正在用 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

返回:

{“城市”:[{“pk”:2,“名称”:“罗马”,“经度”:12.49, “纬度”:41.89,“半径”:10.5},{“pk”:6,“名称”:“河内, 越南”,“经度”:105.84,“纬度”:21.02,“半径”: 10.0},{“pk”:1,“名称”:“米兰”,“经度”:9.19,“纬度”:45.46,“半径”:8.0},{“pk”:3,“名称”:“博洛尼亚” ",“经度”:11.34,“纬度”:44.49,“半径”:5.5},{“pk”:4,“名称”:“维罗纳”,“经度”:10.97, “纬度”:45.41,“半径”:4.5},{“pk”:5,“名称”:“pszczyna, Polonia”,“经度”:18.93,“纬度”:49.98,“半径”: 3.0}]}

为了简短起见,我可以编写相同的视图:

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 应该是什么?

即使这次我如何避免写所有字段?

【问题讨论】:

    标签: python api dictionary model


    【解决方案1】:

    我会使用 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 序列化程序功能的所有功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多