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)