[PYTHON] django-rest-framework Serializer-Felder dynamisch ändern

Einführung

Bei Verwendung des Serializers des Django-Rest-Frameworks zum dynamischen Ändern von Feldern als Antwort auf eine Anfrage eines Clients Sie können mit der Klasse im offiziellen Leitfaden zurückkehren.

Dies ist ein Beispielaufruf aus dem Ansichtssatz. Hier wird nur das Feld dynamisch geändert, aber durch Kombination mit anderen Parametern kann das zurückgegebene Feld flexibel geändert werden.

Dynamische Klassendefinition

Verwenden Sie die Klassen im offiziellen Leitfaden. https://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields

from rest_framework import serializers


class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instantiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

Modell erstellen

Es ist ein Modell mit einem einfachen Code und Namen.

from uuid import uuid4
from django.db import models


class Customer(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    code = models.CharField(verbose_name='Code', help_text='Code', max_length=10)
    name = models.CharField(verbose_name='Name', help_text='Name', max_length=50)

Erstellen eines Serializers

class CustomerSerializer(DynamicFieldsModelSerializer):
    class Meta:
        model = Customer

        fields = (
            'id',
            'code',
            'name',
        )

Ansichtssatz erstellen

Überschreiben Sie "get_serializer" mit dem in der Abfragezeichenfolge festgelegten Feldwert nur, wenn Sie "GET" anfordern Ändern Sie dynamisch die Spalten, um zu erhalten.

from rest_framework import viewsets


class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

    def get_serializer(self, *args, **kwargs):
        if self.action == 'list':
            if 'fields[]' in self.request.query_params:
                kwargs['fields'] = self.request.query_params.getlist('fields[]')

        return super().get_serializer(*args, **kwargs)

Funktionsprüfung

Wenn kein Feld angegeben ist

curl -s -X GET "http://localhost:18000/api/customers/" -H "accept: application/json" | jq .
[
  {
    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx1",
    "code": "001",
    "name": "test1"
  },
  {
    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx2",
    "code": "002",
    "name": "test2"
  }
]

Wenn "Code", wird "Name" im Feld angegeben

curl -s -X GET "http://localhost:18000/api/customers/?fields[]=code&fields[]=name" --globoff -H "accept: application/json" | jq .
[
  {
    "code": "001",
    "name": "test"
  },
  {
    "code": "002",
    "name": "test2"
  }
]

Recommended Posts

django-rest-framework Serializer-Felder dynamisch ändern
Fügen Sie in Django dynamisch Formularfelder hinzu