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 argument 在 RelatedField 上,它是静态的,不能依赖于当前请求。
有什么想法吗?
好吧,您可以尝试在序列化程序的 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/
我有一个带有外键的模型
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 argument 在 RelatedField 上,它是静态的,不能依赖于当前请求。
有什么想法吗?
好吧,您可以尝试在序列化程序的 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/