python - 如何验证 Django REST Framework 序列化程序中的所有相关字段是否指定具有相同所有者的对象?
问题描述
django-organizations
我有一个用于支持共享帐户和rest_framework
API的 Django 应用程序。我有一个用于身份验证的自定义模型,它将用户与特定于组织的 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 进行验证,但你必须将请求传递给序列化器。我的直觉说它在 Viewset 上可能更有意义。这样,如果它正在访问它不应该访问的东西,它会返回 404(更少的信息泄漏)。
要在视图集上有这个,定义 get_queryset w/
def get_queryset(self)
qs = MODEL.objects.filter(relation__user=self.request.user)
return qs
更多示例如下:
推荐阅读
- python - jupyter notebook pyspark 中的 Py4JJavaError
- java - 程序似乎跳过了 while 循环的第一次迭代
- html - 边界半径和图像
- c++ - 如何解决“引发未处理的异常:读取访问冲突”。对于反向链表?
- java - 如何在 float 方法中返回 null
- python - 如何对 JSON Parser Loop 进行错误处理
- dictionary - 为什么我们使用树而不是字典或哈希图来进行 Huffman 压缩?
- image - 将带有图像的表格从谷歌文档导入谷歌表格
- reactjs - 如何将 mailto 设置为子 react.js 组件的属性
- create-react-app - Create-react-app 不支持中继编译器的 --artifactDirectory 选项