Джанго - Как сериализовать наследование - PullRequest
1 голос
/ 07 июля 2019

Я просмотрел документацию по адресу https://django -model-utils.readthedocs.io / en / latest / Manager.html , чтобы узнать больше о InheritanceManager. Я не буду добавлять models.pyпотому что это так же, как в документации.Итак, вот мое views.py:

class PlaceList(generics.ListAPIView):

    serializer_class = PlaceSerializer

    def get_queryset(self):
        return Place.objects.select_subclasses()

Как видите, строка return Place.objects.select_subclasses() возвращает все экземпляры Bar, Restaurant или Place, хранящиеся в базе данных.

My serializers.py выглядит следующим образом:

from rest_framework import serializers
from genericRelations.models import Place, Restaurant, Bar

class PlaceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Restaurant
        fields = ('id', 'location')

class RestaurantSerializer(serializers.ModelSerializer):
    class Meta:
        model = Restaurant
        fields = ('id', 'location', 'restaurant_name')


class BarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bar
        fields = ('id', 'location', 'bar_name')

Я не знаю, как изменить PlaceSerializer, чтобы он также сериализовал / десериализовал подклассы Place.Например, что-то вроде «если встречается экземпляр Bar, затем используйте BarSerializer» и «если встречается экземпляр Restaurant, то используйте RestaurantSerializer».

Примечание: если URL-адрес .../places/, тогда PlaceListвыполняется, что приводит к следующему выводу:

{
    "places": [
        {
            "id": 1, 
            "location": "Köln"
        }, 
        {
            "id": 2, 
            "location": "Köln"
        }, 
        {
            "id": 3, 
            "location": "Köln"
        }, 
        {
            "id": 4, 
            "location": "Köln"
        }, 
        {
            "id": 5, 
            "location": "Köln"
        }
    ]
}

Но я хочу что-то вроде следующего (микс между рестораном и барами):

{
    "places": [
        {
            "id": 1, 
            "location": "Köln"
            "bar_name": "BarName 1"
        }, 
        {
            "id": 2, 
            "location": "Köln"
            "restaurant_name": "RestaurantName 1"
        }, 
        {
            "id": 3, 
            "location": "Köln"
            "bar_name": "BarName 2"
        }, 
        {
            "id": 4, 
            "location": "Köln"
            "bar_name": "BarName 3"
        }, 
        {
            "id": 5, 
            "location": "Köln"
            "restaurant_name": "RestaurantName 2"

        }
    ]
}

Как мне изменитьмой файл serializers.py, чтобы Django мог использовать правильный сериализатор для правильной модели?

1 Ответ

0 голосов
/ 07 июля 2019

Я не знаю хорошего способа сделать это, но есть пакет https://pypi.org/project/django-rest-polymorphic/, который предоставляет полиморфные сериализаторы для Django Rest Framework.В AFF нет, AFAIK, полиморфизма в ModelSerializer.

Вы можете использовать Serializer и реализовать все методы для обнаружения и возврата правильных полей на основе данных, но это нетривиально.

...