如何在 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。 ArduinoArduinoToDatabaseSerializers。这使您的代码更具可读性。 【参考方案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中覆盖相关集的“add”方法

如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证

如何防止 Django 覆盖 sessionid cookie?

如何覆盖默认的 django 忘记密码模板?

如何覆盖 django-redux 默认用户注册表单