Сериализация связанных данных в Django с использованием ключей естественного происхождения (три модели, два слоя)
У меня есть три модели, 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. Я использовал документацию здесь для настройки сериализации натуральных ключей.
Я могу добавить дополнительный код, если нужно, но он в основном шаблонный и работает с двумя моделями в игре (ProductRelease
и Product
или ReleaseNote
и ProductRelease
). Но он не работает с тремя моделями в игре
Например, если я сериализую ProductRelease
объекты, я могу увидеть Product
и поля, которые я указываю:
{
"product_releases": [
{
"model": "products.productrelease",
"pk": 7,
"fields": {
"name": "Product Release A",
"product": "prod1"
}
},
{ . . . },
]
}
Однако я хочу иметь возможность сериализовать ReleaseNote
объекты, но затем показать ProductRelease
(первое отношение внешнего ключа) и объекты Product
(второе отношение внешнего ключа).
Можно ли это сделать в одном JSON-ответе?
Вы можете использовать вложенные сериализаторы моделей для своих целей следующим образом:
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)