在Django中,如何在字段查找中更改字段名称?

时间:2013-12-20 19:08:05

标签: python django django-queryset

django中的字段查找使用在代码中声明它们的形式的字段名称。有没有办法为字段提供自定义名称,仅用于查找?

我想用它来创建一个只读字段,但仍然可以在查询中正常使用它。

例如,如果模型如下所示:

class Flight(models.Model):
    _cancelled = models.BooleanField()

    @property
    def cancelled(self):
        return self._cancelled

然后必须像这样进行过滤:

Flight.objects.all().filter(_cancelled=True)

既然我们希望外面的世界使用cancelled作为属性,那么如果我们可以写的话会更好:

Flight.objects.all().filter(cancelled=True)

我尝试过使用Field.db_column属性,但它似乎只会更改数据库中的列名。

对于上面的示例案例,一个合适的管理器就足以处理这个问题了,但是如果还有另一个带有ForeignKey到Flight的模型,事情会变得更复杂,我们还想对其他模型进行查询,过滤cancelled=True

1 个答案:

答案 0 :(得分:1)

CustomQuerySetManager允许您轻松添加 QuerySets 而不是管理器本身的方法,因此您可以编写cancelled()方法并将其随处可用,即使在相关模型中也是如此。

Flight.objects.cancelled()

它是可链接的: Flight.objects.filter(...).cancelled().update(...)

可用于相关型号: Airport.flights.cancelled()

快速举例:

class Flight(models.Model):
    objects = CustomQuerySetManager()

    # Nested class definition, similar to the Meta class
    class QuerySet(QuerySet):  
        def cancelled(self):
            return self.filter(_cancelled=True)