2016-03-23 61 views
1

當我檢查由Django創建的group_cover表時,有group_id_id字段和group_cover字段。 我想將group_id_id更改爲group_idDjango OneToOneField和ForeignKeyField將「_id」後綴添加到字段

models.py

class Group(models.Model): 

    group_id = models.AutoField(primary_key=True) 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 


class Group_Cover(models.Model): 

    group_id = models.OneToOneField(Group, primary_key=True) # this create group_id_id 
    group_cover = models.ImageField(upload_to="/image/group/") 


class Group_Member(models.Model): 

    user_id = models.ForeignKey(User2) # this create user_id_id 
    group_id = models.ForeignKey(Group) # this create group_id_id 

是啊,如果我寫的,

group = models.OneToOneField(Group, primary_key=True) 

它可能工作,但我可能不需要某些領域的 「_id」 後綴。

我讀this document,但由於我的英語水平差,我無法理解方式。 你能教我如何改變?

回答

4

Django爲自動生成的主鍵添加_id postix。除非使用傳統數據庫,否則通常不需要擔心它們。

解決方案2將是我爲新項目推薦的解決方案之一。解決方案1舊數據庫。

解決方案1 ​​

要修改現有的代碼,請使用以下db_column屬性,因爲它可以讓你的名字在數據庫:

group = models.AutoField(primary_key=True, db_column='group_id') 

Documentation

解決方案領域2

To g以相同的結果以更「Django」的方式讓Django自動生成主鍵,然後在OneToOne和Foreign關鍵字段中引用模型,如下所示。

class Group(models.Model): 
    group_name = models.CharField(max_length=50, unique=False, blank=False) 

class Group_Cover(models.Model): 
    group = models.OneToOneField(Group) 
    group_cover = models.ImageField(upload_to="/image/group/") 

class Group_Member(models.Model): 
    user = models.ForeignKey(User2) 
    group = models.ForeignKey(Group) 
+0

謝謝你,李。我想我必須稍微改變我的數據庫設計。解決方案2對我的代碼很簡單。非常感謝你。 – yamachan

+0

完全沒有問題:) – Lee

+0

類名應遵循Python命名約定(例如'GroupCover'而不是'Group_Cover'和'GroupMember'而不是'Group_Member') – ray

3

您的假設是正確的,您需要重命名您的字段不包含_id(即group而不是group_id)。這將解決你的「問題」,但更重要的是它更準確地代表關係/領域。你與模型有關係,而不是對id的引用。

_id是由django提供的自動引用,以便從模型中檢索_id更容易。

documentation

在幕後,Django的追加「_id」字段名來創建其數據庫列名。在上例中,Car模型的數據庫表將有一個manufacturer_id列。 (你可以通過指定db_column來明確地改變它)。但是,除非你編寫自定義SQL,否則你的代碼不應該處理數據庫的列名。您將始終處理模型對象的字段名稱。

+1

比你的答案。我明白。尾巴...我喜歡索尼克和尾巴。 – yamachan

+1

@yamachan - 不用擔心!尾巴總是最酷的! :) – Sayse

+1

我喜歡這個遊戲,刺蝟索尼克,雖然我連一次都達不到目標......哈哈 – yamachan

2

您不應該擔心在數據庫表中添加的_id。如果您在Django中使用ORM,則不應該處理數據庫。另外,除非特殊類型 - 屬性組,否則不需要指定id。
我會做這樣的(我相信你並不需要那麼多的課):

class Group(models.Model): 
    name = models.CharField(max_length=50, unique=False, blank=False) 
    cover = models.ImageField(upload_to="/image/group/") 
    users = models.ManyToManyField(User2) 

然後,你應該與對象符號訪問屬性。如果你想要ID,使用group.id,如果你想過濾對象,使用Group.objects.filter(id__gt=10)Group.objects.get(id=1)等。我的模型應該做你想要達到的。

+0

非常感謝Lucas03。啊,真的嗎?你的代碼看起來很聰明,特別是用戶領域。感謝您的提示。 – yamachan

相關問題