DRF Response, возвращающий все поля только при использовании метода queryset - PullRequest
0 голосов
/ 14 марта 2019

Я делаю университетский проект, который требует от меня реализации веб-приложения с использованием API в качестве бэкэнда, и я решил использовать для этого DRF, но у меня сейчас есть некоторые проблемы.

Я пытаюсь переопределить метод списка в представлении, чтобы отображать только некоторые поля при получении списка всех записей аэропортов, но все же все поля возвращаются в ответе.

Модель:

class Airport(models.Model):
    code = models.CharField(max_length=10)
    name = models.TextField()
    carriers = models.ManyToManyField(Carrier, related_name='airports')

    def __str__(self):
        return self.name

Serializer:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Airport
        fields = ('id', 'name', 'code', 'url', 'carriers')

Вид:

class AirportView(viewsets.ModelViewSet):
    queryset = models.Airport.objects.all()
    serializer_class = AirportSerializer

    def list(self, request):
        airports = models.Airport.objects.only('id', 'name', 'code')
        data = AirportSerializer(airports, many=True, context={'request': request}).data
        return Response(data)

Ответ:

{
        "id": 4,
        "name": "Leo",
        "code": "Test",
        "url": "http://localhost:8000/api/airports/4/",
        "carriers": []
    },
    {
        "id": 5,
        "name": "asdasd",
        "code": "aasdasd",
        "url": "http://localhost:8000/api/airports/5/",
        "carriers": [
            "http://localhost:8000/api/carriers/1/"
        ]
    },
    {
        "id": 6,
        "name": "asdasd",
        "code": "aasdasd",
        "url": "http://localhost:8000/api/airports/6/",
        "carriers": [
            "http://localhost:8000/api/carriers/1/"
        ]
    }

Как я могу решить это? Есть ли лучший способ сделать это, я имею в виду не использовать метод QuerySet.only?

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Вы должны определить отдельный сериализатор и вернуть его.

0 голосов
/ 14 марта 2019

просто поставьте поле, которое хотите в вашем сериализаторе, вот так:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
     model = models.Airport
    fields = ('id', 'name', 'code')

Ты в порядке.

0 голосов
/ 14 марта 2019

Сериализатор определяет, как сериализуются объекты, а не как вы фильтруете данные из базы данных.В настоящее время у вас есть все поля, доступные в сериализаторе.Если вы не хотите, чтобы некоторые поля возвращались при перечислении или получении элементов, вы можете определить эти поля в сериализаторе как write_only , например так:

class AirportSerializer(serializers.HyperlinkedModelSerializer):
    url = serializer.CharField(write_only=True)
    carriers = serializer.PrimaryKeyRelatedField(many=True, write_only=True)

    class Meta:
        model = models.Airport
        fields = ('id', 'name', 'code', 'url', 'carriers')

Таким образом, URL иПоля носителей не будут присутствовать при возврате данных, но будут необходимы при вставке данных.

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