Django中自定义主键的问题

时间:2011-03-29 23:15:18

标签: django primary-key

在以下模型(Item)中,我的目标是在保存时明确定义自定义对象ID。我正在使用Django 1.2.5和sqlite。

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)

我遇到的问题是,当我要保存已存在的对象时,使用Item模型的管理界面,而不是更新现有记录,而是创建新记录。我尝试使用此代码强制更新

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>

希望我已经足够清楚了!

1 个答案:

答案 0 :(得分: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)