[英]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.