如何在Django中预填充ID

时间:2009-10-31 09:00:04

标签: python django django-models

我有简单的问题模型:

class Question(Polymorph):
    text = models.CharField(max_length=256)
    poll = models.ForeignKey(Poll)
    index = models.IntegerField()

我想预先填充(保存时)带有ID值的索引字段。当然在保存之前我没有ID值(它之后创建),所以我想知道最简单的方法是什么?有什么想法吗?

我想到django-signal,但是我必须两次调用save()方法。

3 个答案:

答案 0 :(得分:5)

但是你这样做,你将不得不两次打电话保存。当新行被INSERT时,ID由数据库服务器直接生成(我相信sqlite除外),因此无论如何你都需要这样做。

我会问你是否确实需要在index字段中输入ID值。毕竟,它始终以obj.id的形式提供,所以即使您希望它作为较长值的一部分,您也可以通过属性动态地计算它。

答案 1 :(得分:0)

是的,试图从某个地方找出下一个ID是不可移植的。比使用信号更简单就是在你的保存方法中加入这样的东西:

def save(self, *args, **kwargs):
    """Save method for Question model"""
    if not self.id:
        super(Question, self).save(*args, **kwargs)
    # Fill the index field
    self.index = self.id # plus whatever else you need
    return super(Question, self).save(*args, **kwargs)

如果您无法从作为过滤器输入的字符串中完全导出对象的id,我猜你必须采用这种方式。但是如果你的字符串中有“something- {id} -something-else”,最好除掉索引字段并使用regexp从字符串中提取id值,然后使用Questions.objects直接过滤id。过滤器(ID =标识)

答案 2 :(得分:0)

绕过双重提交的一种方法是使用除自动增量主键之外的其他东西。 Django并不关心主键是什么,只要有一个,只有一个,它是字符串或整数。你可以使用类似guid的东西,你可以在它们初始化时在你的模型中动态生成,或者当你不关心它是什么时你可以让数据库为你设置它(假设你的数据库支持guids) )。