在Django中,是否可以在创建对象时调用模型本地函数来动态填充字段?
class someModel(models.Model):
id = models.FloatField(primary_key=True, default=generate_id())
def generate_id(self):
newId=time.time()
return newId
到目前为止,我还没有运气或找到涵盖它的文档。
答案 0 :(得分:4)
from django.db import models
import time
class SomeModel(models.Model):
id = models.FloatField(primary_key=True)
def save(self, *args, **kwargs):
if not self.id:
self.id = self.generete_id()
super(SomeModel, self).save(*args, **kwargs)
def generate_id(self):
return time.time()
还要注意Django内部可能有一些代码依赖于未保存的模型实例没有主键的事实(至少在v1.0中就是这种情况)。
另一个缺陷是通过调用time.time()来生成id。在繁重的负载下,你会得到重复的ids。我建议使用uuid module生成唯一标识符。
答案 1 :(得分:2)
是的,这可以使用signals framework完成。
from django.db import models
from django.core.signals import post_init
class SomeModel(models.Model):
pass # *snip*
def generate_id(sender, **kwargs):
kwargs.get('instance').newId = time.time()
# ...
post_init.connect(SomeModel.generate_id)