按相关模型的带注释字段过滤

时间:2020-09-30 14:20:33

标签: python django

我正在动态计算一个字段(=不存储在数据库中),需要通过该字段过滤相关模型。

我的问题如下:

  1. 有什么想法可以过滤计算出的相关字段吗?
  2. 我想了解Django如何处理查询(例如,是否/如果/何时返回QuerySet并对其进行操作,或者是否直接击中数据库)。如果有人可以向我指出相关文档,将不胜感激!

其他信息

我的模型(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文件中 因为这将导致循环引用...

0 个答案:

没有答案
相关问题