Как превратить поля и значения объекта модели в ключи и значения словаря - PullRequest
0 голосов
/ 06 мая 2020

Я создаю приложение в 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, "Name": "Roma", "Долгота": 12,49, "Широта": 41,89, "Радиус": 10,5} , {"pk": 6, "Name": "Ханой, Вьетнам", "Долгота": 105,84, "Широта": 21,02, "Радиус": 10,0}, {"pk": 1, "Name": " Милан »,« Долгота »: 9,19,« Широта »: 45,46,« Радиус »: 8,0}, {« pk »: 3,« Имя »:« Болонья »,« Долгота »: 11,34,« Широта »: 44,49,» Radius ": 5.5}, ​​{" pk ": 4," Name ":" Verona "," Longitude ": 10.97," Latitude ": 45.41," Radius ": 4.5}, {" pk ": 5," Name " : "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, которое возвращает характеристики города с учетом идентификатора города.

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

возвращается:

{"city": {"pk": 2, "Name": "Roma", "Longitude": 12.494757, "Latitude": 41.892786 , "Radius": 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?

Как мне избежать записи всех полей даже в этот раз?

1 Ответ

1 голос
/ 06 мая 2020

Я бы использовал сериализаторы 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...