【问题标题】:limit choices in drop downs in django rest browsable api在 django rest browsable api 中限制下拉选项
【发布时间】:2017-12-22 14:32:25
【问题描述】:

有没有办法限制在 DRF 可浏览 API 中填充哪些字段(例如在下拉选择器或列表选择器中)?

下面是一个图像示例,说明 DRF 如何向用户建议他应该选择的“项目”选项。但是,登录的用户可能有权访问这些项目,也可能没有,所以我想控制这里显示的内容!似乎默认行为是显示所有相关对象。

如果有一种方法可以链接这些字段中填充的对象以根据get_queryset() 函数进行设置,那将非常有用。

这个页面似乎暗示它可能是可能的,我只是找不到如何做到这一点的例子:http://www.django-rest-framework.org/api-guide/filtering/

【问题讨论】:

  • 你发现了吗?

标签: django django-rest-framework


【解决方案1】:

您可以基于某些serializers.RelatedField-ish 类定义一个新字段,并使用上下文中的请求来重新定义方法get_queryset 返回的内容。

一个可能对你有用的例子:

class AuthorRelatedField(serializers.HyperlinkedRelatedField):
    def get_queryset(self):
        if 'request' not in self.context:
            return Author.objects.none()
        request = self.context['request']
        return Author.objects.filter(user__pk=request.user.pk)

class BookSerializer(serializers.HyperlinkedModelSerializer):
    author = AuthorRelatedField(view_name='author-detail')

检查DRF/temapltes/rest_framework/inline/select.html 中的模板。 DRF中的select对象使用字段的iter_options方法来限制select标签中的选项,而select标签又使用来自get_queryset的查询集。

这将有效地限制可浏览 API 中使用的选择标记的选项。如果要保留查询集,也可以在 get_choices 方法中进行过滤(检查 DRF/relations.py 中的代码)。我不确定这是否会影响管理员。

【讨论】:

    【解决方案2】:

    我不完全理解您想要什么,但如果您只需要显示确切值,请尝试查询集过滤器的 __in 函数:

    class PurchaseList(generics.ListAPIView):
        serializer_class = PurchaseSerializer
    
        def get_queryset(self):
            """
            Optionally restricts the returned purchases to a given user,
            by filtering against a `username` query parameter in the URL.
            """ 
            to_show = [ "user1", "user2", "user3"]
            queryset = Purchase.objects.all()
            username = self.request.query_params.get('username', None)
            if username is not None:
                queryset = queryset.filter(purchaser__username__in=username)
            return queryset
    

    您可以将您的值添加到 to_show 列表中,如果 queryset 元素等于其中之一,那么它将被显示。 此外,如果您只想显示模型的某些字段,则需要编辑您的序列化程序的 fields 参数:

    class PurchaseList(serializers.ModelSerializer):
        class Meta:
            model = Purchase
            fields = ('id', 'field1', 'field2', ...)
    

    【讨论】:

    • 这样可以正确进行过滤,但是有没有办法告诉可浏览的 api 在填写下拉或列表选择器的“建议选择”时实际使用该 ListAPIView?我用照片更新了问题以显示我所看到的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多