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

How can I verify that all related fields in a Django REST Framework serializer specify objects with the same owner?

我有一个 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 指定的查询集,但我认为这是不可能的。

想到了两种方法 - 您可以在 ModelSerializer 上执行 w/validation,但您必须随后将请求传递到序列化程序。我的直觉说它在 Viewset 上可能更有意义。这样,如果它正在访问它不应该访问它的东西 returns 404(减少信息泄漏)。

要在视图集上使用它,定义 get_queryset w/

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