[英]When using Generics types, how can I call an Attribute of an inherited class on the Base class instance with Python / Django?
[英]In Python how can I overwrite the class attribute of an inherited class, where that attribute is itself an instance of a model?
如標題所示,我有一個基本的 class ListView,它有一個需要覆蓋的 Serializer 屬性。 對於我的每個 django 模型,我創建了一個子 ListView class 和一個序列化程序。 因此,例如對於 django model 事件,我們有一個對應的視圖 class EventListView(ListView),並且我們有一個對應的序列化器 class EventSerializer(Serializer)。
Serializer child class 在 ListViewClass 中指定,如下面的代碼所示。 是否可以根據提供給 model 的值自動覆蓋序列化程序,我如何將 model 和序列化程序標記為要覆蓋的屬性,因此不需要在基 class 中指定的值?
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
。 然后,在每個子類中,它將使用子類的查詢集 model 和序列化程序,而不是基類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 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.