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

时间:2014-12-02 05:57:22

标签: django python-2.7 django-rest-framework

在Django REST Framework API中,数据库表记录列表在API重新启动或python文件(如model,serializer或view)中的任何代码更改之前都不会更新。我已尝试过交易提交,但它没有奏效。以下是我的观点:

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)

Serializer看起来像这样:

class ServiceSerializer(serializers.ModelSerializer): 

    class Meta:
        model = Service
        fields = ('id', 'category_name', 'parent_id')
        read_only_fields = ('category_name', 'parent_id')

和模型看起来像这样:

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)

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

1 个答案:

答案 0 :(得分:2)

因为您要在self.queryset上设置查询集,这是一个类属性,所以它正在被缓存。这就是为什么您没有为每个请求获取更新的查询集,这也是Django REST Framework calls .all() on querysets in the default 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