【问题标题】:Search fields in custom action method自定义操作方法中的搜索字段
【发布时间】:2021-12-31 12:30:59
【问题描述】:

现在我正在学习 DRF,并且必须使用相册做项目。我的任务之一是使用模型字段“标题”创建自定义@action“补丁”方法,但我不明白如何在自定义方法中添加搜索字段。我们可以在基本方法中看到它们,例如“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', ]

【问题讨论】:

  • 您是否要将putpatch 数据写入PhotoAlbum 类的title 字段?
  • @OmayerHasanMarif 我想添加补丁方法,但如果可能的话,我想知道如何为所有过滤器添加搜索和过滤器

标签: python django django-rest-framework django-swagger


【解决方案1】:

如果您使用的是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)

【讨论】:

  • 感谢您的回答,但这不是我要找的。我想在自定义方法中添加搜索或过滤字段,也许我做错了什么,但这个解决方案对我没有帮助
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多