如何在Djang中预填充ID

2024-06-01 05:17:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的问题模型:

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

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

我考虑了django signal,但之后必须调用save()方法两次。在


Tags: 方法text模型idindexmodelslengthmax
3条回答

不管你怎么做,你都得打两次电话给save。当插入新行时,ID是由数据库服务器直接生成的(我相信sqlite除外),所以在任何情况下都需要这样做。在

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

是的,想从某个地方找出下一个身份证是不方便携带的。比使用信号更简单的方法是在save方法中添加以下内容:

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值,然后直接使用问题.对象.过滤器(id=id)

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

相关问题 更多 >