如何将情境字段添加到序列化器?

时间:2019-04-02 20:26:53

标签: django django-rest-framework

我正在尝试找出处理模型可能具有仅希望RetrieveContent()能够看到的敏感信息的情况的最佳方法。

例如下面的商店:

owner

在此示例中,我希望所有用户都能找到商店,但是class Store(models.Model): owner = models.ForeignKey(Account, on_delete=models.DO_NOTHING) name = models.CharField(max_length=128) license= models.CharField(max_length=128) menu = models.ManyToManyField(Product) address = models.ForeignKey(Address, on_delete=models.DO_NOTHING, blank=True, null=True) class StoreSerializer(serializers.ModelSerializer): owner = AccountSerializer(read_only=True) menu = ProductSerializer(many=True, read_only=True) address = AddressSerializer(read_only=True) class Meta: model = Store fields = ('owner', 'name', 'menu', 'address', 'license') 字段仅在用户是该对象的所有者时才可用于CRUD。

在这种情况下的最佳解决方案是什么? 到目前为止,我的选择似乎是:

A)为所有者类型创建一个单独的序列化器

B)将许可证转换为SerializerMethodField并从那里可选地提供

我想知道哪种方法更好,以及是否还有其他更优雅的方法。

1 个答案:

答案 0 :(得分:0)

我认为,最好的方法是根据要执行请求的用户创建两个不同的序列化器。从DRF文档改写:

  

get_serializer_class(s​​elf)

     

返回应用于序列化程序的类。默认为返回serializer_class属性。

     

可以重写以提供动态行为,例如使用不同的序列化器进行读写操作,或者为不同类型的用户提供不同的序列化器。

这将进一步允许您检查从1类继承的视图的覆盖Storeget_serializer_class所有权的状况,并在使用一个或另一个之间进行选择序列化器。举例说明:

GenericAPIView