2011-03-29 284 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