2011-03-29 285 views
0

在以下模型(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> 

希望我一直够清楚了!

+0

我觉得你以后会试图用count + 1类型的系统创建一个独特的pk,尤其是在可能会删除的时候会遇到问题吗? – DTing 2011-03-29 23:57:37

+0

删除操作可能会遇到什么问题? – Paolo 2011-03-30 19:22:21

+0

是的,会出现问题,ID冲突...有两个项目,1-1和1-2删除第一个和count()+ 1结果在2,所以生成的ID也将是1-2,保存将用“新”一个覆盖“旧”1-2个实例。 – Paolo 2011-03-30 19:41:49

回答

1

这不是对您的问题的直接回答,但您可能希望保留自己的ID字段,而不是添加category_id字段。

from django.db.models import Max 

class Category(models.Model): 
    name = models.CharField(max_length=32) 

class Item(models.Model): 
    cat_id = models.IntegerField(editable=False, blank=True, null=True) 
    group = models.ForeignKey(Category) 

    class Meta: 
     unique_together = ('cat_id', 'group') 

    def save(self, *args, **kwargs): 
     self.cat_id = Items.objects.filter(group=self.group).aggregate(Max('cat_id'))['cat_id__max']+1 
     super(Item, self).save(*args, **kwargs) 
+0

我编辑了添加用例的原始问题,这应该解释为什么我不认为提议的解决方案可以提供帮助。无论如何,谢谢你的帮助:) – Paolo 2011-03-30 18:28:35