python - Django Rest Framework - 在同一视图集中返回不同的序列化程序
问题描述
我有两个模型:哪里
class Hunter(Model):
name = CharField()
搜索
class Target(Model):
name = CharField()
user = ForeignKey(User)
approved_hunters = ManyToManyField(Hunter)
我的序列化程序是
class AnonymousTargetSerializer(ModelSerializer):
class Meta:
name = 'target'
model = Target
fields = ['id',]
并且
class TargetSerializer(ModelSerializer):
class Meta:
name = 'target'
model = Target
fields = ['id',]
我的观点集我想:
hunter = Hunter.objects.get(user=self.request.user)
if hunter in Target.approved_hunters.all()
return TagetSerializer
else:
return AnonymousTargetSerializer
但是,我似乎只为视图集完成了这项工作,但无法在单个对象级别进行过滤。
解决方案
如果您需要根据某些属性修改对象的表示,您可以覆盖序列化程序的to_representation
方法:
class TargetSerializer(ModelSerializer):
class Meta:
name = 'target'
model = Target
fields = ['id',]
def to_representation(self, obj):
hunter = Hunter.objects.get(user=self.context['request'].user)
if hunter not in Target.approved_hunters.all():
return AnonymousTargetSerializer(obj).data
return super().to_representation(obj)
在视图集中,您不需要任何自定义,只需使用TargetSerializer
:
serializer_class = TargetSerializer
推荐阅读
- php - 基于foreach的动态SQL语句
- swift - CBCentralManager 在收到 .resetting 类型的事件后的预期行为是什么
- javascript - 整数/十进制用户输入:如何序列化/存储值
- asp.net - SSRS 报表与 ASP.NET 的集成
- c++ - VS2017:无法添加字符串/wstrings
- directory - STM32与A4899步进电机驱动器通讯
- c++ - 如何将“段”拆分为两个“段”?C++
- java - Java IS-A 与方法覆盖的关系
- python - 如何在 Python 中计算用户输入的数量
- python - 从 Json 文件中获取信息