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