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.
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)
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)
class CustomerSerializer(DynamicFieldsModelSerializer):
class Meta:
model = Customer
fields = (
'id',
'code',
'name',
)
Ü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)
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"
}
]
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"
}
]