Как в Python можно перезаписать атрибут class унаследованного класса, если этот атрибут сам является экземпляром модели?
Как указано в заголовке, у меня есть базовый класс ListView с атрибутом Serializer, который нужно перезаписать. Для каждой из моих django моделей я создаю дочерний класс ListView и Serializer. Так, например, для модели django Event у нас есть соответствующий класс представления EventListView(ListView), и у нас есть соответствующий класс Serializer EventSerializer(Serializer).
Дочерний класс Serializer указан внутри ListViewClass, как в моем коде ниже. Можно ли сделать так, чтобы сериализатор перезаписывался автоматически на основе значения, передаваемого в model, и как я могу отметить model и Serializer как атрибуты, которые будут перезаписываться и поэтому не нуждаются в значениях, указанных в базовом классе?
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = '__all__'
class ListView(APIView):
model = <Model to be overwritten> # Event is set as the default.
Serializer = <Model Serializer to be overwritten>
queryset = model.objects.all()
def get(self,request):
# !!! Get filter conditions from request
queryset = ListView.queryset.filter() # !!! Filter conditions
serializer = ListView.Serializer(queryset,many=True)
return Response(serializer.data)
def post(self,request):
data = JSONParser.parse(request)
serializer = ListView.Serializer(data = data)
if serializer.is_valid():
return Response(serializer.data, status = 201)
else:
return Response(serializer.errors, status = 400)
class EventListView(ListView):
model = Event
Я думаю, что вам нужно использовать self.queryset, self.model и self.Serializer вместо ListView.queryset и ListView.Serializer. Тогда в каждом подклассе будет использоваться кверисет, модель и сериализатор подкласса, а не базы ListView.
В каждом подклассе необходимо переопределить model, queryset и Serializer.
class ListView(APIView):
model = <Model to be overwritten> # Event is set as the default.
Serializer = <Model Serializer to be overwritten>
queryset = model.objects.all()
def get(self,request):
# !!! Get filter conditions from request
queryset = self.queryset.filter() # !!! Filter conditions
serializer = self.Serializer(queryset,many=True)
return Response(serializer.data)
def post(self,request):
data = JSONParser.parse(request)
serializer = self.Serializer(data = data)
if serializer.is_valid():
return Response(serializer.data, status = 201)
else:
return Response(serializer.errors, status = 400)
class EventListView(ListView):
model = Event
Serializer = EventSerializer
queryset = Event.objects.all()
Если вы не хотите определять queryset во всех подклассах, вы, вероятно, захотите добавить метод для получения набора запросов, используя модель, как это
class ListView(APIView):
model = <Model to be overwritten> # Event is set as the default.
Serializer = <Model Serializer to be overwritten>
def get_queryset():
return self.model.objects.all()
def get(self,request):
# !!! Get filter conditions from request
queryset = self.get_queryset().filter() # !!! Filter conditions
serializer = self.Serializer(queryset,many=True)
return Response(serializer.data)
def post(self,request):
data = JSONParser.parse(request)
serializer = self.Serializer(data = data)
if serializer.is_valid():
return Response(serializer.data, status = 201)
else:
return Response(serializer.errors, status = 400)
На самом деле, многое из этого реализовано непосредственно в DRF, что избавит вас от необходимости кодирования. Посмотрите GenericAPIView (https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview) и ListAPIView (https://www.django-rest-framework.org/api-guide/generic-views/#listapiview)