子模型的序列化

时间:2018-06-21 04:38:04

标签: django django-models django-rest-framework django-views

我有模特:

class CommonEditor(models.Model):
    def __str__(self):
        return 'Common Atributes Mask'


class Color(models.Model):
    name = models.CharField(max_length=25)
    editor = models.ForeignKey(CommonEditor, on_delete=models.PROTECT, null=True)

所以我这样进行序列化:

class ColorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Color
        fields = '__all__'

class CommonAttributesSerializer(serializers.ModelSerializer):
    color = ColorSerializer(many=True, read_only=True)

    class Meta:
        model = CommonEditor
        fields = ('pk', 'color')

然后查看:

class CommonAttributeAPIView(generics.ListCreateAPIView):
    serializer_class = CommonAttributesSerializer
    queryset = CommonEditor.objects.all()

我只有我的CommonEditor模型的pk。为什么我无法获得完整的Atributes面膜,该如何修复?非常感谢!

3 个答案:

答案 0 :(得分:3)

反向外键关系的默认名称为modelname_set,或者在您的情况下为color_set。因此,尝试将color字段重命名为color_set

class CommonAttributesSerializer(serializers.ModelSerializer):
    color_set = ColorSerializer(many=True, read_only=True)

    class Meta:
        model = CommonEditor
        fields = ('pk', 'color_set')

答案 1 :(得分:1)

select * from wp_woocommerce_sessions; select * from wp_usermeta where meta_key like '_woocommerce_persistent_cart_%'; CommonEditor 的实例中搜索 CommonAttributesSerializer 属性,但找不到。在DRF序列化程序中,名为color的参数将明确说明在哪里寻找数据。因此,如下更改串行器:

source

参考:DRF Fields -source

答案 2 :(得分:1)

这也可以通过SerializerMethodField来实现,并且可以如下所示:

class CommonAttributesSerializer(serializers.ModelSerializer):
    color = serializers.SerializerMethodField()

    class Meta:
        model = CommonEditor
        fields = ('pk', 'color')

    def get_color(self, common_editor):
        return ColorSerializer(common_editor.color_set.all(), many=True).data

文档:http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

相关问题