如何在Django REST Framework中向serializers.RelatedField传递Trade ID
解决方法
你当前的写法没法动态传递Trade ID到TradePart的查询里,因为RelatedField的queryset参数是静态定义的,没法直接获取当前序列化的Trade实例。下面给你两种可行的实现方式:
方式一:使用SerializerMethodField手动关联
这种方式适合需要自定义查询逻辑的场景:
class TradePartsSerializer(serializers.ModelSerializer): class Meta: model = TradePart fields = '__all__' class TradeSerializer(serializers.ModelSerializer): # 用SerializerMethodField替代原来的RelatedField tradepart = serializers.SerializerMethodField() def get_tradepart(self, obj): # obj就是当前序列化的Trade实例,直接用它的ID过滤TradePart trade_parts = TradePart.objects.filter(trade_id=obj.id) return TradePartsSerializer(trade_parts, many=True).data class Meta: model = Trade fields = ['user', 'partsNum', 'tradepart']
方式二:利用Django反向关联(推荐)
如果你的TradePart模型里已经通过ForeignKey关联到Trade(比如定义了trade = models.ForeignKey(Trade, related_name='tradeparts', on_delete=models.CASCADE)),可以直接用嵌套序列化器,Django会自动处理关联查询:
class TradePartsSerializer(serializers.ModelSerializer): class Meta: model = TradePart fields = '__all__' class TradeSerializer(serializers.ModelSerializer): # 直接使用TradePartsSerializer,many=True表示一对多关联 tradepart = TradePartsSerializer(many=True, read_only=True) class Meta: model = Trade fields = ['user', 'partsNum', 'tradepart']
注意:如果反向关联的related_name不是tradepart,要改成你模型里实际设置的名称。
views.py的代码无需修改,保持原有逻辑即可。
内容的提问来源于stack exchange,提问作者omar fadi
相关产品推荐
相关产品推荐

