我正在动态计算一个字段(=不存储在数据库中),需要通过该字段过滤相关模型。
我的问题如下:
其他信息
我的模型(models.py)
from .managers import StackManager, PartManager
class Build(models.Model):
...
class Part(models.Model):
build = models.ForeignKey('Build', models.CASCADE, related_name='parts')
x_min = models.FloatField()
x_max = models.FloatField()
y_min = models.FloatField()
y_max = models.FloatField()
z_min = models.FloatField()
z_max = models.FloatField()
volume = models.FloatField()
objects = PartManager()
class Stack(models.Model):
build = models.OneToOneField('Build', models.DO_NOTHING, related_name='stack')
height = models.FloatField()
objects = StackManager()
我的模型管理器和查询集管理器(managers.py)
class StackQuerySet(models.QuerySet):
def calc(self,**kwargs):
valid_parts = self.filter(
build__parts__y__lte=F('height'),
) \
.annotate(
total_built_parts_volume = Sum(F('build__parts__volume'))
)
return valid_parts
class StackManager(models.Manager):
def get_queryset(self):
return StackQuerySet(self.model, using=self._db)
class PartManager(models.Manager):
def get_queryset(self):
return super().get_queryset()\
.annotate(
x = F('x_max') + F('x_min'),
y = F('y_max') + F('y_min'),
z = F('z_max') + F('z_min')
)
我要打电话的内容
Stack.objects.get_calc()
由于“ y_min”和“ y_max”可以轻松更改,因此我想保留 “ y”作为计算字段。但是,我在其他地方也需要“ y” 计算,而这在我得到时似乎不可能
相关字段的查找无效:y
我已经从属性中移动了字段(模型中的@property) 定制的模型管理器,但这似乎也无济于事。它 在我看来,filter和F()对象直接击中了数据库 而不返回QuerySet,但是我什至无法确认 找不到相关文档。
作为附加说明,我无法将模型导入到.managers.py文件中 因为这将导致循环引用...