现有客户端已经在发送类似结构的数据......
{
"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 序列化器来做到这一点?
您可以使用带有 星号 (
'*'
) 的字符串文字,如文档中指定的[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',
)