我正在尝试找出处理模型可能具有仅希望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并从那里可选地提供
我想知道哪种方法更好,以及是否还有其他更优雅的方法。
答案 0 :(得分:0)
我认为,最好的方法是根据要执行请求的用户创建两个不同的序列化器。从DRF文档改写:
get_serializer_class(self)
返回应用于序列化程序的类。默认为返回serializer_class属性。
可以重写以提供动态行为,例如使用不同的序列化器进行读写操作,或者为不同类型的用户提供不同的序列化器。
这将进一步允许您检查从1
类继承的视图的覆盖Store
中get_serializer_class
所有权的状况,并在使用一个或另一个之间进行选择序列化器。举例说明:
GenericAPIView