You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:57:20