Я просмотрел документацию по адресу 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 мог использовать правильный сериализатор для правильной модели?