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

django-rest-framework : restrict RelatedField queryset according to request

我有一个带有外键的模型

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 的下拉选项中显示相关查询集。

如果可以 define a queryset argumentRelatedField 上,它是静态的,不能依赖于当前请求。

有什么想法吗?

好吧,您可以尝试在序列化程序的 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.

访问

您可以修改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/