Есть ли способ показать только некоторые поля модели?
У меня есть модель с экземплярами полей и есть представления. Могу ли я сделать так, чтобы при перенаправлении на главную страницу были видны только ID, название, срок, сделано? Но когда вы перенаправляетесь на страницу деталей, вы можете видеть все поля модели.
models.py:
class Task(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
body = models.TextField()
deadline = models.DateTimeField()
done = models.BooleanField()
views.py :
lass TaskList(generics.ListCreateAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer
serializers.py:
class TaskSerializer(serializers.ModelSerializer):
class Meta:
fields = (
"id",
"title",
"body",
"author",
"deadline",
"done",
)
model = Task
urls.py:
urlpatterns = [
path("<int:pk>/", TaskDetail.as_view(), name="task_detail"),
path("", TaskList.as_view(), name="task_list"),
]
Пожалуйста, добавьте ссылку на полезные материалы для чтения
После инициализации сериализатора словарь полей, которые установленных в сериализаторе, можно получить доступ с помощью атрибута .fields. Доступ и изменение этого атрибута позволяет динамически модифицировать сериализатор.
Модификация аргумента fields напрямую позволяет вам делать интересные вещи, такие как изменение аргументов в сериализаторе. такие вещи, как изменение аргументов полей сериализатора во время выполнения, а не в момент объявления сериализатора.
Следуя примеру, приведенному в документации выше:
serializers.py
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().__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)
class TaskSerializer(DynamicFieldsModelSerializer):
class Meta:
fields = (
"id",
"title",
"body",
"author",
"deadline",
"done",
)
model = Task
Вы можете либо переопределить views.py
, предоставляемый get
ListCreateAPIView, либо метод, предоставляемый list
ListModelMixin, как в этом примере и в следующем блоке кода:
views.py
class TaskList(generics.ListCreateAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer
def list(self, request):
# Note the use of `get_queryset()` instead of `self.queryset`
queryset = self.get_queryset()
serializer = TaskSerializer(queryset, many=True, fields=('id', 'title', 'deadline'))
return Response(serializer.data)
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer