Поля поиска в методе пользовательского действия
Сейчас я изучаю DRF и должен сделать проект с фотоальбомами. Одна из моих задач - создать пользовательский метод @action "patch", использующий поле модели "title", но я не могу понять, как добавить поля для поиска в пользовательские методы. Мы можем видеть их в базовых методах, таких как "get", "patch" и "put", но я не могу найти никакой информации о том, как добавить их в пользовательские действия. Если кто-нибудь знает, как это сделать, пожалуйста, расскажите мне.
Моя модель:
class PhotoAlbum(models.Model):
title = models.CharField(verbose_name='Название альбома', max_length=50, null=True)
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name='Автор')
created_at = models.DateTimeField(verbose_name='Дата создания', editable=False,
default=datetime.datetime.today())
class Meta:
verbose_name = 'Фотоальбом'
verbose_name_plural = 'Фотоальбомы'
def __str__(self):
return f'{self.title} Автор: {self.created_by} Дата: {self.created_at}'
Мое мнение:
def photo_album_view(request):
photo_albums = PhotoAlbum.objects.all()
context = {
'photo_albums': photo_albums,
}
return render(request, 'photo_album.html', context=context)
Мой набор представлений:
class AlbumFilter(django_filters.FilterSet):
title = django_filters.Filter(field_name='title')
class PhotoAlbumViewSet(viewsets.ModelViewSet):
queryset = PhotoAlbum.objects.all()
filterset_class = AlbumFilter
serializer_class = PhotoAlbumSerializer
pagination_class = ResultPagination
filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
search_fields = ['title', ]
ordering_fields = ['created_at', ]
Если вы используете ModelViewSet
, я полагаю, вы ищете один из этих пользовательских методов:
def update(self, request, pk=None):
pass
def partial_update(self, request, pk=None):
pass
Эти функции позволяют добавить пользовательские функции к вашему методу обновления. Reference
Краткий пример:
def partial_update(self, request, pk=None):
serializer = UserPostSerializer(user, data=request.data, partial=True)
if serializer.is_valid():
try:
serializer.save()
except ValueError:
return Response({"detail": "Serializer not valid."}, status=400)
return Response({"detail": "User updated."})
else:
return Response(serializer.errors)