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

标签 python django django-rest-framework django-organizations

我有一个 Django 应用程序,它使用 django-organizations 来支持共享帐户,并使用 rest_framework 作为 API。我有一个自定义身份验证模型,它将用户与特定于组织的 API token 相关联。

我有一个带有一些外键的模型、一个带有相关字段的序列化器以及一个用于 API View 的 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 上进行验证,但是您必须将请求传递到序列化器中。我的直觉告诉我,这在 View 集上可能更有意义。这样,如果它正在访问不应访问的内容,则会返回 404(信息泄漏较少)。

要将其放在 View 集上,请定义 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

关于python - 如何验证 Django REST Framework 序列化程序中的所有相关字段都指定具有相同所有者的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384810/

相关文章:

python - 在生成器中使用 return 语句

python - Matplotlib 无对象 'Use' 或 '__version__'

python - 将 Django json 导入 iPhone App

python - ManyToManyField 序列化模型缺乏数据

python - Django 是否请求数组

jquery - 为什么 json.dumps() 在使用变量时会抛出 500 内部服务器错误?

python - 将 .txt 数据分组到数据框中

Django/Rest框架: how to get data from model that has on foreign key in it

python - 请求模块抛出 OpenSSL.SSL.Error

android - 处理不同尺寸照片的移动应用程序和服务器的设计