Сериализация связанных данных в 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)