父模型的序列化,包括子模型

D. *_*ake 7 django django-models django-rest-framework

我有模型 - 商品、服装和儿童模型,如配饰、外套等:

class Commodity(models.Model):
    atribute = models.CharField()

class Clother(models.Model):
    commodity = models.ForeignKey(Commodity)
    clother_atribute = models.CharField()

class Acessories(models.Model):
    clother = models.ForeignKey(Clother)
    acessories_atribute = models.CharField() 

class Outwear(models.Model):
    clother = models.ForeignKey(Clother)
    outwear_atribute = models.CharField()
Run Code Online (Sandbox Code Playgroud)

如何序列化父模型商品以调用所有垂直依赖项。我想查询 Commodity id 并获取所有 Clother 属性和 Acessories 或 Outwear 属性。谢谢!

mre*_*han 9

或者,也可以使用以下方法来实现SerializerMethodField:http ://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

class ClotherSerializer(serializers.ModelSerializer):
    """
    Serializer for Clother data model.
    """
    acessories = serializers.SerializerMethodField()
    outwears = serializers.SerializerMethodField()

    class Meta:
        model = Clother
        fields = ('id', 'acessories', 'outwears')

    def get_acessories(self, clother):
        return AcessoriesSerializer(clother.acessories_set.all(), many=True).data

    def get_outwears(self, clother):
        return OutwearSerializer(clother.outwear_set.all(), many=True).data


class CommoditySerializer(serializers.ModelSerializer):
    """
    Serializer for Commodity data model.
    """
    clother = serializers.SerializerMethodField()

    class Meta:
        model = Commodity
        fields = ('id', 'clother')

    def get_clother(self, commodity):
        return ClotherSerializer(commodity.clother_set.all(), many=True).data
Run Code Online (Sandbox Code Playgroud)


nev*_*ner 7

如果我理解你的问题,你可以定义ClotherSerializer. 您可以使用depth = 1在此序列化程序中序列化嵌套对象:

class ClotherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Clother
        fields = ('id', 'acessories_set', 'outwear_set')
        depth = 1
Run Code Online (Sandbox Code Playgroud)

稍后CommoditySerializer您可以使用ClotherSerializer序列化服装及其所有关系:

class CommoditySerializer(serializers.ModelSerializer):
    clother_set = ClotherSerializer(many=True)
    class Meta:
        model = Commodity
        fields = ('id', 'clother_set')
Run Code Online (Sandbox Code Playgroud)