简体   繁体   English

django-rest-framework:根据请求限制RelatedField查询集

[英]django-rest-framework : restrict RelatedField queryset according to request

I have a model with a ForeignKey 我有一个带有ForeignKey的模型

models.py models.py

class B(models.Model):
    user = models.ForeignKey(contrib.auth.User)

class A(models.Model):
    b = models.ForeignKey(B)

serializers.py serializers.py

class ASerializer(serializers.ModelSerializer):
    class Meta:
        model = A
        fields = ['b']

views.py views.py

class AViewSet(iewsets.ModelViewSet):
    queryset = A.objects.all()
    serializer_class = ASerializer

Now what I want is to restrict the Ab values to the B instances owned by the currently logged-in user. 现在,我想要将Ab值限制为当前登录用户拥有的B实例。

I know how to enforce that at saving-time, but I would like to only present the relevant queryset in the dropdown choice in the browsable API interface . 我知道如何在保存时强制执行该操作,但是我只想在可浏览API接口的下拉选项中显示相关的查询集

If one can define a queryset argument on the RelatedField , it's static and can't depend on the current request. 如果可以在RelatedField定义queryset参数 ,则它是静态的,并且不依赖于当前请求。

Any ideas ? 有任何想法吗 ?

Well you could try overriding queryset in init of serializer. 好吧,您可以尝试在序列化程序的init中覆盖queryset。 something like 就像是

def __init__(self, *args, **kwargs):
    super(MySerializerClass, self).__init__(*args, **kwargs)
    if self.context.get('request', None):
        field = self.fields.get('b')
        field.queryset = field.queryset.filter(user=request.user)

Current user shall be accessible through self.context. 当前用户应可通过self.context访问。

You can modify the get_queryset: 您可以修改get_queryset:

class AViewSet(iewsets.ModelViewSet):
    serializer_class = ASerializer

    def get_queryset(self):
        user = self.request.user
        return A.objects.filter(b__user = user)

ref: http://www.django-rest-framework.org/api-guide/filtering/ 参考: http : //www.django-rest-framework.org/api-guide/filtering/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM