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