簡體   English   中英

與get_object_or_404 django失敗

[英]Failed with the get_object_or_404 django

這是代碼:

>>> 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()它正在調用 _get_queryset()函數,該函數返回manager.all() 但是由於覆蓋, all()僅返回未激活的對象,並且get_object_or_404(KirrURL,shortcode='pric3e')為空。

您的自定義管理器產生不一致的結果,因為並非總是調用.all() 如果希望該管理器始終過濾掉特定實例,則應重寫get_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_object_or_404(KirrURL, shortcode='pric3e')將能夠找到您的實例),但是您可以使用KirrURL.custom.all()訪問所有非活動實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM