删除对象后,它仍处于响应数据中。
/api/premises/premises/4
返回
{
"detail": "Not found."
}但/api/premises/premises/
返回
[
{
"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
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
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
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',)发布于 2021-04-11 12:20:31
问题在您的get_queryset中,如下所示:
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。因此,您应该将实现更改为:
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()发布于 2021-04-10 22:34:10
如果使用浏览器查看/api/premises/premises/,则可能正在查看该页面的缓存版本。尝试使用Ctrl-R重新加载页面的新版本。
发布于 2021-04-11 06:46:04
也许问题在端点/api/premises/premises/4的观点中。能否提供更多有关视图及其序列化程序的详细信息?
另外,我注意到端点/api/premises/premises/4中缺少尾随斜杠(/api/premises/premises/4),而不是端点/api/premises/premises/。这可能会触发重定向http调用,以防尾随斜杠已在urls.py中定义。
https://stackoverflow.com/questions/67036512
复制相似问题