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

Python 按相关模型的注释字段过滤,python,django,Python,Django,我正在动态计算一个字段(=未存储在数据库中),需要根据该字段过滤相关模型 我的问题如下: 有什么想法吗?我如何过滤计算出的相关字段 我想了解Django如何处理查询(例如,它是否/如果/何时返回查询集并对其进行操作,或者它是否直接命中数据库)。如果有人能向我指出相关文件,那将不胜感激 其他信息 我的模型(Models.py) 我的模型管理器和查询集管理器(Managers.py) 我想说的是 Stack.objects.get_calc() 因为“y_min”和“y_max”很容易改变,所以

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

我的问题如下:

  • 有什么想法吗?我如何过滤计算出的相关字段
  • 我想了解Django如何处理查询(例如,它是否/如果/何时返回查询集并对其进行操作,或者它是否直接命中数据库)。如果有人能向我指出相关文件,那将不胜感激 其他信息

    我的模型(Models.py)

    我的模型管理器和查询集管理器(Managers.py)

    我想说的是

    Stack.objects.get_calc()
    
    • 因为“y_min”和“y_max”很容易改变,所以我想保持不变 “y”作为计算字段。然而,我在其他方面也需要“y” 计算,这似乎是不可能的,因为我得到

      相关字段的查找无效:y

    • 我已经从属性(@property in model)中移动了字段 对于自定义模型管理器,这似乎也没有帮助。信息技术 在我看来,filter和F()对象直接命中数据库 没有返回查询集,但我甚至无法确认这一点,因为我 未能找到相关文档

    • 另外,我不能将模型导入.managers.py文件 因为这将导致循环引用


    如果我理解正确,您希望获得堆叠高度小于或等于y_max+y_min的零件的总体积吗?@iklinac是的,没错!
    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()