DRF Transaction序列化器新增apartment_sold字段不显示问题
问题根因
apartment_sold字段不生效的核心问题是序列化器字段配置缺少source映射:
DRF的HyperlinkedRelatedField默认会去当前序列化的Transaction模型实例上查找和字段同名(也就是apartment_sold)的关联属性,但从你的perform_create逻辑可以看出,Transaction模型上和公寓关联的外键字段实际名为apartment,不存在apartment_sold这个属性,自然取不到值返回。
另外你配置的view_name='sold-detail'也存在路由匹配风险:HyperlinkedRelatedField是用来生成单个关联对象的详情超链接,和你自定义的SoldViewSet过滤已售出公寓的逻辑没有绑定关系,不会自动套用该视图集的过滤规则。
修复代码
直接修改serializers.py里的TransactionSerializer,补充source参数,同时修正view_name为Apartment模型对应视图集的详情路由名:
class TransactionSerializer(serializers.HyperlinkedModelSerializer): buyer = serializers.ReadOnlyField(source='buyer.username') apartment_sold = serializers.HyperlinkedRelatedField( view_name='apartment-detail', source='apartment', # 映射到Transaction模型上实际存在的apartment外键字段 read_only=True ) class Meta: model = Transaction fields = [ 'id','buyer','apartment_sold','timestamp' ]
可选调整
- 如果你不想返回超链接,而是要返回关联公寓的完整详情数据,直接把
apartment_sold字段换成嵌套序列化器即可:apartment_sold = ApartmentSerializer(source='apartment', read_only=True) - 由于你在创建交易时已经把关联公寓的
issold标记为True,不需要额外在关联字段里做已售出过滤,所有交易关联的公寓天然是已售出状态。 - 建议给
TransactionViewSet的查询集加上select_related('apartment', 'buyer')优化,避免序列化时产生N+1查询问题:queryset = Transaction.objects.all().select_related('apartment', 'buyer').order_by('-timestamp')
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

