2012-03-31 106 views
0

我有我的模型設備的自定義管理器。如果返回的查詢集是空的,我想返回一個不同的對象。問題是空的查詢集不被評估爲空。檢查Django中的空查詢集

我查看了這些線程以瞭解如何檢查查詢集是否爲空。 In Django, what is the most efficient way to check for an empty query set? Checking for empty queryset in Django

這是我的模型:

class DeviceField(models.Model): 
    """ 
    Can be connected to any class and any field in that class. Specifies how the values and field names are returned for the field. 
    """ 
    device = models.ForeignKey(Device, verbose_name=_("Device")) 
    content_type = models.ForeignKey(ContentType, verbose_name=_("Class")) 
    field_name = models.CharField(max_length=150, verbose_name=_("field name")) 
    display_field = models.CharField(max_length=255, verbose_name=_("How to display the field name?")) 
    display_value = models.CharField(max_length=255, verbose_name=_("How to display the value?")) 

    objects = DeviceFieldManager() 

這是我的經理。看看我如何使用所有這些if語句來檢查它是否爲空。

class DeviceFieldManager(models.Manager): 
    """ 
    Behaves like a normal manager. Except in the case that no such device field exists. Then it will return the standard value of the field. 
    """ 
    def get_query_set(self): 
     """ 
     Does the queryset overriding :). If empty, get the original values 
     """ 
     queryset = super(DeviceFieldManager,self).get_query_set() 
     try: 
      a = queryset[0] 
      print "we have something here" 
     except IndexError: 
      print "It is frigging empty" 
     if queryset == super(DeviceFieldManager, self).none(): 
      print "this queryset is just like an empty one" 
     if not queryset: 
      print "not queryset" 
     if not queryset.count(): 
      print "not queryset count" 
     if queryset: 
      print "if queryset" 
     if queryset.exists(): 
      print "queryset exists" 
     else: 
      print "A value is return, we don't need to do anything!" 
     print queryset.count() 
     print super(DeviceFieldManager, self).none() 
     print queryset == super(DeviceFieldManager, self).none() 
     return queryset 

而這是來自殼。對於「移動」(存在)和「牛」(不存在)的設備,管理器顯示相同的行爲。當我嘗試打印查詢集的第一個值時,我得到了「牛」的預期IndexError。

In [8]: a= DeviceField.objects.filter(device__name="mobile") 
we have something here 
if queryset 
queryset exists 
1 
[] 
False 

In [9]: a[0] 
Out[9]: <DeviceField: DeviceField object> 

In [10]: a= DeviceField.objects.filter(device__name="cow") 
we have something here 
if queryset 
queryset exists 
1 
[] 
False 

In [11]: a[0] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
/<ipython-input-11-5ccf417d7af1> in <module>() 
----> 1 a[0] 

/local/lib/python2.7/site-packages/django/db/models/query.pyc in __getitem__(self, k) 
    188    qs = self._clone() 
    189    qs.query.set_limits(k, k + 1) 
--> 190    return list(qs)[0] 
    191   except self.model.DoesNotExist, e: 
    192    raise IndexError(e.args) 

IndexError: list index out of range 

我在這裏做錯了什麼?如何查看經理如果查詢集爲空或不空?

感謝很多:)

回答

1

經理get_query_set被稱爲before filtering所以你需要以某種方式侵入的QuerySet本身(或作出將做檢查外部函數)。