我有简单的问题模型:
class Question(Polymorph):
text = models.CharField(max_length=256)
poll = models.ForeignKey(Poll)
index = models.IntegerField()
我想预先填充(保存时)带有ID值的索引字段。当然在保存之前我没有ID值(它之后创建),所以我想知道最简单的方法是什么?有什么想法吗?
我想到django-signal,但是我必须两次调用save()方法。
答案 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) )。