如何在 django Rest Framework 序列化器中任意嵌套一些数据

问题描述 投票:0回答:1

现有客户端已经在发送类似结构的数据......

{
    "hive_metadata": {"name": "hive name"},
    "bees": [{"name": "bee 1", "name": "bee 2", ...}]
}

对于以下型号:

class Hive(models.Model):
    name = models.CharField(max_length=32, help_text="name")


class Bee(models.Model):
    name = models.CharField(max_length=32, help_text="name")
    hive = models.ForeignKey(
        Hive, help_text="The Hive associated with this Bee", on_delete=models.CASCADE
    )

使这成为可能的代码手动迭代传入的数据。我想使用 django Rest Framework 序列化器重写它;然而,

hive_metadata
本身是嵌套的这一事实到目前为止一直困扰着我。

如果我写

class BeesSerializer(ModelSerializer):
    class Meta:
        model = models.Bee
        fields = ("name",)

class PopulatedHiveSerializer(ModelSerializer):
    bees = BeesSerializer(many=True, source="bee_set")
    class Meta:
        model = models.Hive
        fields = ("name","bees",)

会产生

{
    "name": "hive name",
    "bees": [{"name": "bee 1", "name": "bee 2", ...}]
}

很容易。我希望我可以通过引用子序列化器来解决它,比如

class HiveMetaDataSerializer(ModelSerializer):
    class Meta:
        model = models.Hive
        fields = ("name",)

class PopulatedHiveSerializer(ModelSerializer):
    bees = BeesSerializer(many=True, source="bee_set")
    hive_metadata = HiveMetaDataSerializer(source=???)
    class Meta:
        model = models.Hive
        fields = ("hive_metadata","bees",)

但我似乎无法弄清楚要在“源”中放入什么,以便将相同的对象通过外部序列化器传递到内部。

那么,有没有办法使用 django Rest Framework 序列化器来做到这一点?

python django django-rest-framework
1个回答
0
投票

您可以使用带有 星号 (

'*'
) 的字符串文字,如文档中指定的[drf-doc]:

value source='*'
有特殊含义,用来表示 整个对象应该传递到该字段。这个可以 对于创建嵌套表示或对于字段很有用 需要访问完整的对象才能确定输出 代表。

所以我们可以使用:

class PopulatedHiveSerializer(ModelSerializer):
    bees = BeesSerializer(many=True, source='bee_set')
    hive_metadata = HiveMetaDataSerializer(source='*')

    class Meta:
        model = models.Hive
        fields = (
            'hive_metadata',
            'bees',
        )
© www.soinside.com 2019 - 2024. All rights reserved.