【问题标题】:Django annotate model custom methodDjango注释模型自定义方法
【发布时间】:2018-04-18 01:44:26
【问题描述】:

我想使用自定义方法值并计算它。是否可以注释模型的自定义方法?如果是的话,你能举个例子吗?提前致谢!

型号

class Project(model.models):

    project_name = models.CharField(
        _('Project name'),
       max_length=255,
       blank=True,
       null=True,
   )

   def custom_method(self):
       return 100

查询

qs = Project.objects.annotate(new_val=F('custom_method')  * 1.5 ) 

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    没有。任何通过内置管理器的东西都必须是一个真实的字段,因为它们只涉及数据库。为了使用自定义字段/属性,他们必须将表中的每条记录转换为模型,然后在 Python 中过滤它们。

    来源:Django - Can you use property as the field in an aggregation function?

    如果您尝试按照您提到的方式进行注释,您会得到一个FieldError,如下所示,

    FieldError: Cannot resolve keyword 'custom_method' into field. Choices are: project_name
    



    简而言之,您只能使用实际数据库属性/字段

    进行注释

    【讨论】:

    • 感谢您的快速回复和解释。然后我必须循环查询集才能使用自定义方法的值。
    【解决方案2】:

    我相信您必须先评估查询集。所以一旦你这样做:

    for i in qs:
        return i.custom_method * 1.5
    

    使用 Product.objects.all() 查询集,那么它应该可以工作。

    【讨论】:

    • 感谢您的回复。这就是我现在所拥有的。我想在不使用循环的情况下计算值,只需过滤/注释。
    • 是的,我认为您不能使用普通的过滤器/注释 Django 查询对自定义方法执行任何操作,因为自定义方法在技术上不在数据库中。一旦查询集被评估,它就会被调用。我不确定您使用自定义方法的原因,但您可以编写一个注释语句,将您选择的列乘以 1.5?您是否考虑过这些类型的选项?
    • 在计算方面有点复杂,还有更多的计算要做。我只举了一个基本的例子。无论如何,感谢您的回复。
    猜你喜欢
    • 2013-04-18
    • 2011-04-24
    • 2011-08-14
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多