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属性,但它似乎只是更改数据库中的列名。

对于上面的示例案例,适当的Manager足以处理此问题,但是如果存在另一个将Foreigncc设置为Flight的模型,事情就变得更加复杂,而我们想对该其他模型进行查询,但仍要过滤cancelled=True

最佳答案

CustomQuerySetManager允许您轻松地添加方法来执行QuerySet而不是管理器本身,因此您可以编写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)

07-24 09:53