使用自然外键序列化Django中的相关数据(三种模型,两层)
Serializing Related Data in Django using Natural Foregin Keys (Three Models, Two Layers)
我有三个模型,Product
、ProductRelease
和 ReleaseNote
,它们都继承自具有以下关系的抽象模型工厂(具有公共字段):
class Product(abstract_base_model_factory()):
<additional fields>
class ProductRelease(abstract_base_model_factory()):
<additional fields>
product = models.ForeignKey(Product, on_delete=models.CASCADE,
related_name='product_releases')
class ReleaseNote(abstract_base_model_factory()):
<additional fields>
product_release = models.ForeignKey(ProductRelease, on_delete=models.CASCADE,
related_name='release_notes')
我已按照文档序列化这些以返回 JSON。我使用 docs here 来设置自然键的序列化。
如果需要,我可以添加额外的代码,但它主要是样板文件并且适用于两个模型(ProductRelease
和 Product
或 ReleaseNote
和 ProductRelease
).但它不适用于三个模型。
例如,如果我序列化 ProductRelease
个对象,我可以看到 Product
和我指定的字段:
{
"product_releases": [
{
"model": "products.productrelease",
"pk": 7,
"fields": {
"name": "Product Release A",
"product": "prod1"
}
},
{ . . . },
]
}
但是,我希望能够序列化 ReleaseNote
个对象,然后显示 ProductRelease
(第一个外键关系)和 Product
(第二个外键关系)对象。
是否可以在不使用像 Django REST Framework 这样的包的情况下在单个 JSON 响应中完成?我想在不需要额外软件包的情况下实现这一目标。
更新
一段时间后,我意识到 @oleksii 是对的。我最终实现了 Django REST Framework 并获得了我需要的嵌套。效果很好。
您可以像这样使用嵌套模型序列化程序:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = "__all__"
class ProductReleaseSerializer(serializers.ModelSerializer):
product = ProductSerializer(many=True)
class Meta:
model = ProductRelease
fields = "__all__"
class ReleaseNoteSerializer(serializers.ModelSerializer):
product_release = ProductReleaseSerializer()
class Meta:
model = ReleaseNote
fields = "__all__"
release_note_model_instance = ReleaseNote.objects.all()
print(ReleaseNoteSerializer(release_note_model_instance, many=True).data)
我有三个模型,Product
、ProductRelease
和 ReleaseNote
,它们都继承自具有以下关系的抽象模型工厂(具有公共字段):
class Product(abstract_base_model_factory()):
<additional fields>
class ProductRelease(abstract_base_model_factory()):
<additional fields>
product = models.ForeignKey(Product, on_delete=models.CASCADE,
related_name='product_releases')
class ReleaseNote(abstract_base_model_factory()):
<additional fields>
product_release = models.ForeignKey(ProductRelease, on_delete=models.CASCADE,
related_name='release_notes')
我已按照文档序列化这些以返回 JSON。我使用 docs here 来设置自然键的序列化。
如果需要,我可以添加额外的代码,但它主要是样板文件并且适用于两个模型(ProductRelease
和 Product
或 ReleaseNote
和 ProductRelease
).但它不适用于三个模型。
例如,如果我序列化 ProductRelease
个对象,我可以看到 Product
和我指定的字段:
{
"product_releases": [
{
"model": "products.productrelease",
"pk": 7,
"fields": {
"name": "Product Release A",
"product": "prod1"
}
},
{ . . . },
]
}
但是,我希望能够序列化 ReleaseNote
个对象,然后显示 ProductRelease
(第一个外键关系)和 Product
(第二个外键关系)对象。
是否可以在不使用像 Django REST Framework 这样的包的情况下在单个 JSON 响应中完成?我想在不需要额外软件包的情况下实现这一目标。
更新
一段时间后,我意识到 @oleksii 是对的。我最终实现了 Django REST Framework 并获得了我需要的嵌套。效果很好。
您可以像这样使用嵌套模型序列化程序:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = "__all__"
class ProductReleaseSerializer(serializers.ModelSerializer):
product = ProductSerializer(many=True)
class Meta:
model = ProductRelease
fields = "__all__"
class ReleaseNoteSerializer(serializers.ModelSerializer):
product_release = ProductReleaseSerializer()
class Meta:
model = ReleaseNote
fields = "__all__"
release_note_model_instance = ReleaseNote.objects.all()
print(ReleaseNoteSerializer(release_note_model_instance, many=True).data)