记录列表未在 Django REST 框架中获取更新的记录..?

Rit*_*esh 2 django python-2.7 django-rest-framework

在 Django REST Framework API 中,直到 API 重新启动或 Python 文件(例如模型、序列化程序或视图)中的任何代码更改之前,数据库表记录列表不会更新。我尝试过事务提交,但没有成功。以下是我的看法:

class ServiceViewSet(viewsets.ModelViewSet):
    #authentication_classes = APIAuthentication,
    queryset = Service.objects.all()
    serializer_class = ServiceSerializer
    def get_queryset(self):
        queryset = self.queryset
        parent_id = self.request.QUERY_PARAMS.get('parent_id', None)
        if parent_id is not None:
           queryset = queryset.filter(parent_id=parent_id)
        return queryset   
    # Make Service readable only
    def update(self, request, *args, **kwargs): 
        return Response(status=status.HTTP_400_BAD_REQUEST)    
    def destroy(self, request, *args, **kwargs):
        return Response(status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

序列化器看起来像这样:

class ServiceSerializer(serializers.ModelSerializer): 

    class Meta:
        model = Service
        fields = ('id', 'category_name', 'parent_id')
        read_only_fields = ('category_name', 'parent_id')
Run Code Online (Sandbox Code Playgroud)

模型如下所示:

class Service(models.Model):
    class Meta:
        db_table = 'service_category'
        app_label = 'api'
    category_name = models.CharField(max_length=100)
    parent_id = models.IntegerField(default=0)
    def __unicode__(self): 
        return  '{"id":%d,"category_name":"%s"}' %(self.id,self.category_name)
Run Code Online (Sandbox Code Playgroud)

仅此服务才会出现此问题,其余 API 工作正常。任何帮助将不胜感激。

Kev*_*own 6

因为您要在 上设置查询集self.queryset(它是一个类属性),所以它会被缓存。这就是为什么您没有为每个请求获取更新的查询集的原因,也是 Django REST Framework默认.all()get_queryset. 通过调用.all()查询集,它将不再使用缓存的结果,并将强制进行新的评估,这就是您正在寻找的。

class ServiceViewSet(viewsets.ModelViewSet):
    queryset = Service.objects.all()

    def get_queryset(self):
        queryset = self.queryset.all()
        parent_id = self.request.QUERY_PARAMS.get('parent_id', None)

        if parent_id is not None:
           queryset = queryset.filter(parent_id=parent_id)

        return queryset
Run Code Online (Sandbox Code Playgroud)