使用模型中的函数动态填充Django中对象创建的字段

时间:2010-05-03 01:15:35

标签: django django-models

在Django中,是否可以在创建对象时调用模型本地函数来动态填充字段?

class someModel(models.Model):
    id = models.FloatField(primary_key=True, default=generate_id())

    def generate_id(self):
        newId=time.time()
        return newId

到目前为止,我还没有运气或找到涵盖它的文档。

2 个答案:

答案 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)