私のモデルデバイス用のカスタムマネージャがあります。返されるクエリーセットが空の場合、別のオブジェクトを返す必要があります。問題は、空のクエリセットが空であると評価されないことです。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
私はここで間違っていますか?クエリーセットが空であるかどうか、マネージャーでチェックインする方法は?
どうもありがとう:)