Skip to main content
 首页 » 编程设计

python之get_object_or_404 django 失败

2025年05月04日21cyq1162

这是代码:

>>> 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' 

我现在正在练习 django 模型。问题是当我使用 get_object_or_404 试图获取与第二个关键字参数匹配的数据时,它以某种方式失败了。当我使用 get() 方法时。它成功了。我想我认为我应该在这里得到相同的结果。

#Model Class 
class KirrURLManager(models.Manager): 
    def all(self,*args,**kwargs): 
        qs = super(KirrURLManager,self).all(*args,**kwargs) 
        qs_main = qs.filter(active=False) 
        return qs_main 
 
    def refresh_shortcodes(self,items=None): 
        qs = KirrURL.objects.filter(id__gte=1) 
        if items is not None and isinstance(items,int): 
            qs = qs.order_by('-id')[:items] 
        for q in qs: 
            q.shortcode = create_shortcode(q) 
            q.save() 
            print(q.id) 
class KirrURL(models.Model): 
    url = models.CharField(max_length=220,) 
    shortcode = models.CharField(max_length=SHORTCODE_MAX,unique=True,blank=True) 
    updated = models.DateTimeField(auto_now=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 
    active = models.BooleanField(default=True) 
    objects = KirrURLManager() 
    some_random = KirrURLManager() 
    def save(self, *args, **kwargs): 
        if self.shortcode is None or self.shortcode == "": 
            self.shortcode = create_shortcode(self) 
        super(KirrURL, self).save(*args, **kwargs) 
    def __str__(self): 
        return str(self.url) 
    def __unicode__(self): 
        return str(self.url) 

请您参考如下方法:

我想问题出在覆盖 all() 方法上。 当您使用 get_object_or_404() 时,它是 calling _get_queryset() 函数返回 manager.all()。但由于重写 all() 仅返回非事件对象,并且 get_object_or_404(KirrURL,shortcode='pric3e') 的结果为空。