Python 获取\u对象\u或\u 404 django失败

Python 获取\u对象\u或\u 404 django失败,python,django,django-models,Python,Django,Django Models,代码如下: >>> from shortener.models import KirrURL >>> from django.shortcuts import get_object_or_404 >>> obj = get_object_or_404(KirrURL,shortcode='pric3e') Traceback (most recent call last):File"/Users/phil/Desktop/django110

代码如下:

>>> from shortener.models import KirrURL
>>> from django.shortcuts import get_object_or_404
>>> obj = get_object_or_404(KirrURL,shortcode='pric3e')

Traceback (most recent call last):File"/Users/phil/Desktop/django110/lib/python3.5/site
packages/django/shortcuts.py", line 85, in get_object_or_404
return queryset.get(*args, **kwargs)
File "/Users/phil/Desktop/django110/lib/python3.5/site-packages/django/db/models/query.py", line 385, in get
self.model._meta.object_name
shortener.models.DoesNotExist: KirrURL matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/phil/Desktop/django110/lib/python3.5/site-packages/django/shortcuts.py", line 93, in get_object_or_404
raise Http404('No %s matches the given query.' %     queryset.model._meta.object_name)
django.http.response.Http404: No KirrURL matches the given query.

>>> obj = KirrURL.objects.get(shortcode='pric3e')
>>> obj
<KirrURL: http://google.com>
>>> obj.id
1
>>> obj.url
'http://google.com'

我想问题在于重写
all()
方法。
使用
get\u object\u或
时,返回
manager.all()
的函数是
\u get\u queryset()
。但是由于重写
all()
只返回非活动对象,因此
get\u object\u或_404(KirrURL,shortcode='pric3e')
的结果是空的。

我想问题在于重写
all()
方法。
使用
get\u object\u或
时,返回
manager.all()
的函数是
\u get\u queryset()
。但是由于重写
all()
只返回非活动对象,并且
get\u object\u或_404(KirrURL,shortcode='pric3e')
的结果为空。

您的自定义管理器产生了不一致的结果,因为
.all()
并不总是被调用。如果希望此管理器始终筛选出特定实例,则应重写
get\u queryset()
。请确保在自定义管理器上方包含一个默认管理器,这样您仍然可以访问所有实例,例如admin

class KirrURLManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(active=False)

class KirrURL(models.Model):
    objects = models.Manager() # default manager, put this one first
    custom = KirrURLManager()

现在
KurrURL.objects.all()
将返回所有实例(并且
get\u object\u或_404(KirrURL,shortcode='pric3e')
将能够找到您的实例),但您可以使用
KirrURL.custom.all()访问所有非活动实例

您的自定义管理器产生不一致的结果,因为不总是调用
.all()
。如果希望此管理器始终筛选出特定实例,则应重写
get\u queryset()
。请确保在自定义管理器上方包含一个默认管理器,这样您仍然可以访问所有实例,例如admin

class KirrURLManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(active=False)

class KirrURL(models.Model):
    objects = models.Manager() # default manager, put this one first
    custom = KirrURLManager()

现在
KurrURL.objects.all()
将返回所有实例(并且
get\u object\u或_404(KirrURL,shortcode='pric3e')
将能够找到您的实例),但您可以使用
KirrURL.custom.all()访问所有非活动实例

是啊!感谢它的帮助。我终于发现了一个问题,即我覆盖的save方法过滤了错误的值(active应该是真的)。仍然感谢你的建议。我不知道get_objects_或_404以前会调用all方法。是的!感谢它的帮助。我最终发现了一个问题,即我覆盖的save方法过滤了错误的值(active应该是这样的)。仍然感谢你的建议。之前不知道get_objects_或_404会调用all方法。是的,谢谢!我发现问题是因为我在保存方法中设置了错误的值。是的,谢谢!我发现问题是因为我在save方法中设置了错误的值。