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
个实例?
答案 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