在Django中检查空的查询集

6 浏览
0 Comments

在Django中检查空的查询集

我为我的设备模型创建了一个自定义管理器。如果返回的查询集为空,我想返回一个不同的对象。问题是一个空的查询集并不会被评估为为空。\n我查看了以下线程以找出如何检查查询集是否为空。\n在Django中,检查空查询集的最有效方法是什么?\n在Django中检查空查询集\n这是我的模型:\n

    class DeviceField(models.Model):
    """
    可以连接到任何类和该类中的任何字段。指定字段的值和字段名称的返回方式。
    """
    device = models.ForeignKey(Device, verbose_name=_("设备"))
    content_type = models.ForeignKey(ContentType, verbose_name=_("类"))
    field_name = models.CharField(max_length=150, verbose_name=_("字段名称"))
    display_field = models.CharField(max_length=255, verbose_name=_("如何显示字段名称?"))
    display_value = models.CharField(max_length=255, verbose_name=_("如何显示值?"))
    objects = DeviceFieldManager()

\n这是我的管理器。看看我如何使用所有这些if语句来检查它是否为空。\n

class DeviceFieldManager(models.Manager):
    """
    表现得像一个正常的管理器。除非不存在这样的设备字段。否则将返回字段的标准值。
    """
    def get_query_set(self):
        """
        重写查询集 :)
        如果为空,则获取原始值
        """
        queryset = super(DeviceFieldManager,self).get_query_set()
        try:
            a = queryset[0]
            print "我们这里有东西"
        except IndexError:
            print "它是空的"
        if queryset == super(DeviceFieldManager, self).none():
            print "这个查询集就像一个空的一样"
        if not queryset:
            print "没有查询集"
        if not queryset.count():
            print "没有查询集计数"
        if queryset:
            print "有查询集"
        if queryset.exists():
            print "查询集存在"
        else:
            print "返回一个值,我们不需要做任何事情!"
        print queryset.count()
        print super(DeviceFieldManager, self).none()
        print queryset == super(DeviceFieldManager, self).none()
        return queryset

\n这是来自shell的内容。对于设备“mobile”(存在)和“cow”(不存在),管理器显示相同的行为。当我尝试打印查询集的第一个值时,对于“cow”,我得到了预期的IndexError。\n

In [8]: a= DeviceField.objects.filter(device__name="mobile")
我们这里有东西
有查询集存在
1
[]
False
In [9]: a[0]
Out[9]: 
In [10]: a= DeviceField.objects.filter(device__name="cow")
我们这里有东西
有查询集存在
1
[]
False
In [11]: a[0]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/ in ()
----> 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

\n我在这里做错了什么?我如何在管理器中检查查询集是否为空?\n非常感谢 🙂

0
0 Comments

Django中的一个常见问题是在查询集中检查是否为空。在Django中,查询集是通过管理器对象进行管理的。在某些情况下,我们需要在查询集中进行空值检查。然而,使用管理器的get_query_set方法进行检查时会出现问题。

问题的原因是,在过滤之前,管理器的get_query_set方法被调用。这意味着我们无法直接在这个方法中检查查询集是否为空。在这种情况下,我们需要在查询集本身中进行一些修改或者创建一个外部函数来进行检查。

解决这个问题的方法之一是通过修改查询集本身来进行空值检查。我们需要在查询集中添加一些额外的代码来实现这个功能。具体的实现方式可以参考上述链接中的代码。

另一种解决方法是创建一个外部函数来进行检查。我们可以在函数中接收查询集作为参数,并在函数中进行空值检查。这样我们就可以在任何需要进行空值检查的地方调用这个函数。

,Django中检查空查询集的问题是由于管理器的get_query_set方法在过滤之前被调用所导致的。为了解决这个问题,我们可以通过修改查询集本身或者创建一个外部函数来进行空值检查。无论使用哪种方法,我们都可以在Django中有效地检查空查询集。

0