在以下模型(Item
)中,我的目标是在保存时明确定义自定义对象ID。我使用的是Django 1.2.5和sqlite。Django中的自定义主键问题
class Category(models.Model):
name = models.CharField(max_length=32)
class Item(models.Model):
id = models.CharField(primary_key=True, blank=True, max_length=8)
group = models.ForeignKey(Category)
def save(self, *args, **kwargs):
self.id = "%s-%s" % (self.group.id, self.group.item_set.count() + 1)
super(Item, self).save(*args, **kwargs)
我有使用管理界面的项目模型,当我准备的,而不是更新现有记录中创建一个新的记录保存一个已经存在的对象,问题。我试图用此代码强制更新适当时
def save(self, *args, **kwargs):
update = bool(self.id)
self.id = "%s-%s" % (self.group.id, self.group.item_set.count() + 1)
super(Item, self).save(force_update=update, *args, **kwargs)
但没有成功。现在保存更改会触发此出现其它问题后:
DatabaseError at /admin/type/catalog/1_3/
Forced update did not affect any rows.
我想知道我在做什么错,如果有解决这个问题的一种方式。
感谢
- 编辑 - (需要更多的帮助!)
使用案例。
我想要获得当选择一个类别时,只有属于该类别的项目显示在项目选择框中。
因此,我需要使用ID字段将每个项目与相应的类别相关联,以便管理界面中的类别和项目(如果在同一页面中一起)将与它们的ID关联(并且因此很容易处理使用jQuery)。通过这种方式:
<select id="id_category" name="category">
<option value="1">color</option>
<option value="2">car</option>
</select>
<select id="id_item" name="item">
<option value="1_1">red</option>
<option value="1_2">blue</option>
<option value="2_1">audi</option>
</select>
如果我会用另一种领域,但ID,组合框的管理将是respecet如果他们的ID完全无关,因为项目选择是:
<option value="1">red</option>
<option value="2">blue</option>
<option value="3">audi</option>
希望我一直够清楚了!
我觉得你以后会试图用count + 1类型的系统创建一个独特的pk,尤其是在可能会删除的时候会遇到问题吗? – DTing 2011-03-29 23:57:37
删除操作可能会遇到什么问题? – Paolo 2011-03-30 19:22:21
是的,会出现问题,ID冲突...有两个项目,1-1和1-2删除第一个和count()+ 1结果在2,所以生成的ID也将是1-2,保存将用“新”一个覆盖“旧”1-2个实例。 – Paolo 2011-03-30 19:41:49