数据库查询结果作为Django模型字段的默认值?

时间:2011-08-06 17:56:16

标签: python django django-models default-value

models.py
class Aref5(models.Model):
    name = Aref5.objects.all.order_by('id')[0]
    Rthink = models.TextField(max_length=2000,  blank=True, default=name)
    <....>

我希望default的{​​{1}}值为最后一项的Rthink

使用上面的代码,我收到一条错误消息,指出id无法识别。如何访问Aref5定义中的现有Aref5个实例?

2 个答案:

答案 0 :(得分:3)

这里有几个问题。一个是如果这个工作,只要Django启动就会计算name一次,Aref5的每个实例都会得到相同的默认值。另一种是尝试访问其定义中的类会导致错误。

default(或任何TextField子类)的Field参数可以是可调用的而不是值,在这种情况下,只要创建新对象,就会调用它。这样的事情应该有效:

Rthink = models.TextField(max_length=2000, blank=True, default=lambda: str(Aref5.objects.latest('id').id))

由于涉及Aref5的表达式出现在函数体内,因此不会立即对其进行评估。

答案 1 :(得分:0)

根据最近的documentation for the default value This can be a value or a callable object. If callable it will be called every time a new object is created.

The default can’t be a mutable object (model instance, list, set, etc.), as a reference to the same instance of that object would be used as the default value in all new model instances. Instead, wrap the desired default in a callable.

示例:

def contact_default():
    return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)

lambdas can’t be used for field options like default because they can’t be serialized by migrations