代码之家  ›  专栏  ›  技术社区  ›  jakogut

如何验证Django REST框架序列化程序中的所有相关字段是否指定了具有相同所有者的对象?

  •  1
  • jakogut  · 技术社区  · 7 年前

    我有一个Django应用程序,它使用 django-organizations rest_framework 对于API。我有一个自定义的身份验证模型,它将用户与特定于组织的API令牌关联起来。

    我有一个带有几个外键的模型,一个带有相关字段的序列化程序,以及一个用于API视图的ModelViewSet。我希望确保用于创建或修改模型实例的任何API调用都验证为相关字段指定的对象是否具有相同的所有者(组织)。

    class Bar(models.Model):
        uuid = models.UUIDField(
            default=uuid.uuid4, editable=False, unique=True)
        organization = models.ForeignKey(
            Organization, on_delete=models.CASCADE)
    
    class Foo(models.Model):
        uuid = models.UUIDField(
            default=uuid.uuid4, editable=False, unique=True)
        organization = models.ForeignKey(
            Organization, on_delete=models.CASCADE)
        bar = models.ForeignKey(
            Bar, on_delete=models.CASCADE)
    
    class FooSerializer(serializers.ModelSerializer):
        class Meta:
            model = Foo
            fields = ('uuid', 'organization', 'bar')
    
        bar = serializers.SlugRelatedField(
            slug_field='uuid', queryset=Bar.objects.all())
    

    如何验证相关对象是否属于同一帐户?理想情况下,我能够覆盖为每个 RelatedField 在序列化程序中,但我认为这是不可能的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   yrekkehs    7 年前

    我想到了两种方法——您可以在ModelSerializer上进行w/验证,但随后必须将请求传递到序列化程序中。我的直觉告诉我,在Viewset上可能更有意义。这样,如果它正在访问不应该访问的内容,它将返回404(更少的信息泄漏)。

    def get_queryset(self)
        qs = MODEL.objects.filter(relation__user=self.request.user)
        return qs
    

    下面有更多的例子:

    https://docs.djangoproject.com/en/2.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset