根据模型值,通过动态函数调用将django模型转换为查询集/更新对象

时间:2012-02-28 13:54:03

标签: django django-models

我需要使用update()更新几个对象,而不是save()方法。 是否可以将模型转换为查询集来执行此操作?

否则我尝试了类似的事情:

objects = Article.objects.all()
ctype = ContentType.objects.get_for_model(Article)
objects.update( stats=process_data(F('id'), ctype) )

process_data获取与Article相关的其他对象,并在计算后返回float:

def process_data(object_id, content_type):
    counts = Counter.objects.get(content_type=content_type, object_pk=object_id)
    ...
    return float(calculation_based_on_counts)

不幸的是,这是不可能的。我得到一个MultipleObjectsReturned异常:

counter.models.MultipleObjectsReturned:get()返回多个Counter - 它返回15!查询参数为{' object_pk':,' content_type':}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

F类不会返回值,正如您的代码所期望的那样。 F个对象是表达式中的节点。

F表达式只允许某个操作子集,主要是布尔逻辑和算术:不是任意函数。如果你对它的工作原理感兴趣,请看django/db/models/expressions.py。它的记录不尽如人意。

在不知道你的计算是什么的情况下,不可能说F是否可能。例如,如果您使用aggregate表达式将updateF合并,则可以更新某些相关对象的总和。