django-rest-framework:根据请求限制RelatedField queryset

时间:2015-02-24 10:32:10

标签: python django authorization django-rest-framework

我有一个带有ForeignKey的模型

models.py

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

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

serializers.py

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

views.py

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

现在我想要的是将A.b值限制为当前登录用户拥有的B个实例。

我知道如何在保存时强制执行此操作,但我只想在browsable API interface的下拉选项中显示相关的查询集。

如果 RelatedField 上有人define a queryset argument,则它是静态的,不能依赖当前的请求。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试在序列化程序的 init 中覆盖查询集。

之类的东西
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)

当前用户可以通过self.context访问。

答案 1 :(得分:-1)

您可以修改get_queryset:

class AViewSet(iewsets.ModelViewSet):
    serializer_class = ASerializer

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

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