2013-06-02 110 views
5

Django 1.5+允許我們爲用戶添加自定義字段。我想用這個事實,但我不一定知道什麼是好的做法。以下是我對如何處理模型感到困惑的情況。Django 1.5 +用戶模型關係

給字段添加到User,如果一個項目只有一個類型的User,可以說一個Student模式的選項,可我只是添加特定學生字段User?我是Django的新手,但我相信另一種方法是設置一般的User設置,並創建一個Student模型,並在其中調用一個一對一的唯一字段。

您是否應該擴展Django User的字段以模仿模型的字段,即使該項目只能保證一種類型的用戶?

回答

12

如果您只有一種類型的用戶並且正在使用Django 1.5+,我會建議您利用新的AbstractUser。 Extending Django's default user

當您要添加的誕生和最喜歡的顏色的日期一個例子:如果你需要更多的靈活性,可以延長AbstractBaseUser代替AbstractUser

#myusers/models.py 
from django.contrib.auth.models import AbstractUser 
from django.db import models 

class MyUser(AbstractUser): 
    dob = models.DateField() 
    favorite_color = models.CharField(max_length=32, default='Blue') 

,但最基本的情況下,你應該只需要AbstractUser。

另請注意,無論哪種情況,您都需要reference your user model by using settings.AUTH_USER_MODEL

使用了上面的例子,並假設它是在被稱爲myusers定義的應用程序:

#settings.py 
AUTH_USER_MODEL = 'myusers.MyUser' 

你提到建立了一個對一個領域的學生模型,用戶模型的方法仍然有效,但並不那麼幹淨(如果您有多種用戶,仍然存在這種情況)。

我通常不喜歡在回答中引用的書籍,但我發現,Two Scoops of Django's,在用戶模式第16章給了地方的不同選擇比網上的Django的當前版本相應更清晰的解釋文檔。這本書對Django非常有用,是基於1.5編寫的。但是,你必須購買這本書或者找到一個擁有它的人......(僅供參考:我沒有收到任何推薦的資金)。

你也可以看看這個SO提問/回答:https://stackoverflow.com/a/14104748/307293

+0

什麼不乾淨呢? –

+3

它在數據庫中創建一個額外的表。如果你經常引用諸如名字和姓氏之類的東西以及一些需要每次額外加入JOIN的自定義信息。 – Jacinda

+0

Jacinda - 巧合的是我今天早些時候購買了這本書!我還沒有到那裏,但是看那個引用,他們給出了三個很好的選擇:從相關模型,AbstractUser的子類或AbstractBaseClassUser的子類鏈接回來。不幸的是,我正在使用我想要繼承的第三方應用程序,以及有關如何執行此操作的任何想法? – Joker

0

您不應該觸摸django捐助的User模型(來自認證框架)。這將打破升級,你不知道它可能會產生什麼後果。

有兩種基本方法可以做到這一點:

  1. 如果你只需要保存有關用戶的其他信息,但不需要更改身份驗證/授權機制是如何工作的,創建一個模型並在User模型中添加OneToOneField。在這個模型中,存儲任何其他雜項信息。

  2. 如果你想改變認證的工作方式,你可以create your own User model並讓django使用(僅限1.5+)。

+5

此,如果你在1.5開始一個新的應用程序是不正確的。如果您只需添加其他字段,則新的最佳實踐是從AbstractUser繼承。 – Jacinda

+0

不,您只能在創建用戶模型時從AbstractUserModel繼承_replacement_;如果你只是想添加一個字段,你不應該那樣做。如果您正在對認證/授權過程如何適用於您的應用程序進行根本性更改,則應該創建您自己的用戶模型替換。 –

+3

我不是在談論創建替代品的AbstractBaseUser。我在談論AbstractUser。從文檔:「如果你對Django的用戶模型完全滿意,並且你只想添加一些額外的配置文件信息,你可以簡單地繼承django.contrib.auth.models.AbstractUser並添加你的自定義配置文件字段。完全實現默認用戶作爲抽象模型。「 – Jacinda