2012-03-31 2 views
0

내 모델 디바이스 용 맞춤 관리자가 있습니다. 반환 된 쿼리 집합이 비어 있으면 다른 개체를 반환하고 싶습니다. 문제는 빈 쿼리 세트가 비어있는 것으로 평가되지 않는다는 것입니다.django에서 빈 쿼리 세트를 확인하십시오.

queryset이 ​​비어 있는지 확인하는 방법을 찾기 위해이 스레드를 조사했습니다. 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 

그리고 이것은 쉘에서 온 것입니다. "mobile"(존재하는) 및 "cow"(존재하지 않음) 장치의 경우 Manager는 동일한 동작을 표시합니다. 쿼리 세트의 첫 번째 값을 인쇄하려고하면 "암소"에 대해 예상되는 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

관리자의 before filtering 그래서 당신이 검색어 세트 자체에 어떻게 든 해킹 (또는 검사를 할 것입니다 외부 기능을)해야합니다 get_query_set라고합니다.

관련 문제