如何在 Django 中覆盖“get_queryset()”
Posted
技术标签:
【中文标题】如何在 Django 中覆盖“get_queryset()”【英文标题】:how to override 'get_queryset()' in Django 【发布时间】:2020-11-08 14:47:58 【问题描述】:我将在 django 中使用通用视图。我定义了 serializer_class 并覆盖了 get_queryset() 方法,但是有一个错误告诉我要覆盖 get_queryset() 方法。我想知道我的覆盖方法是怎么错的,以及我必须做些什么来解决这个错误。这是我的代码。
views.py
from .models import arduino
from .serializers import arduinoToandroidSerializers, arduinoToDatabaseSerializers
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework.generics import ListCreateAPIView
class arduinoToAndroidViewSet (ViewSet) :
def dataSend (self, request) :
user = self.request.user
queryset = arduino.objects.filter(name=user)
serializer = arduinoToAndroidSerializers(queryset, many=True)
return Response(serializer.data)
class arduinoToDatabaseViewSet (ListCreateAPIView) :
serializer_class = arduinoToDatabaseSerializers
def dataReceive (self, request) :
user = self.request.user
queryset = self.get_queryset()
queryset = arduino.objects.filter(queryset, name=user)
serializer = arduinoToDatabaseSerializers(queryset, many=True)
return Response(serializer.data)
序列化器.py
class arduinoToAndroidSerializers (serializers.ModelSerializer) :
name = serializers.CharField(source='name.username')
class Meta :
model = arduino
fields = ('name', 'temp', 'humi')
class arduinoToDatabaseSerializers (serializers.ModelSerializer) :
class Meta :
model = arduino
fields = ('temp', 'humi')
除此之外,如果您在我的代码中看到改进点,请给我提示
【问题讨论】:
据我所知,您没有覆盖 get_queryset 方法。你可以阅读overriding the initial queryset in the DRF docs。您可能还想查看DRF ViewSets documentation,因为您还没有为您的ViewSet 实现诸如list
之类的方法。如果你还没有学过DRF的官方教程,这个supplementary guide可以帮到你。
另外,Python 命名约定建议将类的第一个字母大写。因此,要遵循您将使用的约定 e. G。 Arduino
和 ArduinoToDatabaseSerializers
。这使您的代码更具可读性。
【参考方案1】:
您可以像这样覆盖查询集。请参阅docs 了解更多信息。
class arduinoToDatabaseViewSet (ListCreateAPIView) :
serializer_class = arduinoToDatabaseSerializers
def get_queryset(self) :
user = self.request.user
return arduino.objects.filter(name=user)
【讨论】:
它不起作用 :( "'arduinoToDatabaseViewSet' 应该包含queryset
属性,或者覆盖get_queryset()
" 方法。已显示以上是关于如何在 Django 中覆盖“get_queryset()”的主要内容,如果未能解决你的问题,请参考以下文章
在测试期间,如何覆盖 urlconf 中使用的 Django 设置?
如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证