在以下模型(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>
希望我已经足够清楚了!
答案 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)