首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Django Rest Framework对象仍然出现在列表中?

为什么Django Rest Framework对象仍然出现在列表中?
EN

Stack Overflow用户
提问于 2021-04-10 16:08:38
回答 3查看 71关注 0票数 1

删除对象后,它仍处于响应数据中。

/api/premises/premises/4

返回

代码语言:javascript
复制
{
   "detail": "Not found."
}

/api/premises/premises/

返回

代码语言:javascript
复制
[
    {
        "id": 1,
        "image": "/product/lb-gallery-main.jpg",
        "owner": "owner@lebernardin.com",
        "name": "Le Bernardin",
        "description": "Le Bernardin to francuska restauracja z owocami morza na Manhattanie w Nowym Jorku. Gilbert Le Coze i jego siostra Maguy Le Coze otworzyli restaurację w Paryżu w 1972 roku, pod nazwą Les Moines de St. Bernardin.",
        "country": "Poland",
        "city": "Gdynia",
        "postcode": "80-209",
        "address": "Starowiejska 1",
        "tags": [
            1,
            2
        ]
    },
    {
        "id": 4,
        "image": "naws.com/product/Union-Oksford.jpg",
        "owner": "admin@admin.com",
        "name": "dadad",
        "description": "dada",
        "country": "dada",
        "city": "dada",
        "postcode": "dad",
        "address": "dadadada",
        "tags": []
    },
    {
        "id": 2,
        "image": "196290008887877_5616210528952631689_n.jpg",
        "owner": "admin@admin.com",
        "name": "Sebastian Wrzałek",
        "description": "adadada",
        "country": "dadad",
        "city": "adada",
        "postcode": "dada",
        "address": "dadadadaddd",
        "tags": []
    }
]

奇怪的是它没有显示在Django管理上。另外,我使用的是Docker,重新启动后它正在更新列表,并且没有显示已删除的项目。当我直接检查数据库表时,数据是correntc,意味着项被正确删除。我在想它从哪里来,为什么会被缓存?

docker-compose.yml

代码语言:javascript
复制
version: "3"

services:
    redis:
        image: redis
        command: redis-server
        ports:
            - "6379:6397"
    app:
        build:
            context: .
        ports:
            - "8000:8000"
        volumes:
            - ./app:/app
        command: >
            sh -c "python manage.py wait_for_db &&
                   python manage.py check_connection &&
                   python manage.py migrate &&
                   python manage.py runserver 0.0.0.0:8000"
        environment:
            - DB_HOST=db
            - DB_NAME=app
            - DB_USER=postgres
            - DB_PASS=sspassword
        depends_on:
            - db
        env_file:
            - .env
    db:
        image: postgis/postgis:9.6-2.5-alpine
        environment:
            - POSTGRES_DB=app
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=sspassword

编辑。

views.py

代码语言:javascript
复制
class PremisesViewSet(viewsets.ModelViewSet):
    """Manage premises in database"""
    lookup_field = 'id'
    lookup_url_kwarg = 'premises_id'
    serializer_class = serializers.PremisesSerializer
    queryset = Premises.objects.all()
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        """Retreive the premises for auth user"""
        try:
            # TODO create wrapper for header
            if(self.request.META['HTTP_X_SOURCE_WEB']):
                return self.queryset.filter(owner=self.request.user)
        except KeyError:
            return self.queryset

    def get_serializer_class(self):
        """Return appropriate serializer class"""
        return self.serializer_class

    def perform_create(self, serializer):
        """Create a new premises"""
        serializer.save(owner=self.request.user)

    @action(detail=True, methods=['get'])
    def menu(self, request, **kwargs):
        instance = self.get_object()
        menu = Menu.objects.filter(premises=instance, is_default=True)
        serializer = MenuProductsSerializer(menu, many=True)
        return Response(serializer.data)

Serializers.py

代码语言:javascript
复制
class PremisesSerializer(serializers.ModelSerializer):
    """Serializer a premises"""
    image = Base64ImageField(max_length=None)
    owner = serializers.ReadOnlyField(source='owner.email')
    location = serializers.HiddenField(default=Point(1,1))

    class Meta:
        model = Premises
        fields = '__all__'

        read_only_fields = ('id',)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-11 12:20:31

问题在您的get_queryset中,如下所示:

代码语言:javascript
复制
def get_queryset(self):
    """Retreive the premises for auth user"""
    try:
        # TODO create wrapper for header
        if(self.request.META['HTTP_X_SOURCE_WEB']):
            return self.queryset.filter(owner=self.request.user)
    except KeyError:
        return self.queryset

问题是,在except块中,您是直接返回self.queryset。由于查询集实际上是在类上定义的,它已经在一些以前的请求中进行了计算。如果您看到get_queryset的默认实现有以下几行:

if isinstance( queryset,QuerySet):#确保对每个请求重新评估查询集。queryset = queryset.all()

queryset = queryset.all()线是我们在这里关注的问题。这样做的目的是(正如注释已经指出的那样),它确保对每个请求重新评估QuerySet。因此,您应该将实现更改为:

代码语言:javascript
复制
def get_queryset(self):
    """Retreive the premises for auth user"""
    # TODO create wrapper for header
    if self.request.META.get('HTTP_X_SOURCE_WEB') is not None: # Instead of try-except use .get() which will return `None` if the header is not set
        return self.queryset.filter(owner=self.request.user)
    return self.queryset.all()
票数 1
EN

Stack Overflow用户

发布于 2021-04-10 22:34:10

如果使用浏览器查看/api/premises/premises/,则可能正在查看该页面的缓存版本。尝试使用Ctrl-R重新加载页面的新版本。

票数 0
EN

Stack Overflow用户

发布于 2021-04-11 06:46:04

也许问题在端点/api/premises/premises/4的观点中。能否提供更多有关视图及其序列化程序的详细信息?

另外,我注意到端点/api/premises/premises/4中缺少尾随斜杠(/api/premises/premises/4),而不是端点/api/premises/premises/。这可能会触发重定向http调用,以防尾随斜杠已在urls.py中定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67036512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档