2016-06-30 40 views
0

在我的django模型中,我想將字段unique_id設置爲主鍵,因爲這將是模型查詢中使用的字段。它滿足unique=Truenull=False。然而,因爲Django在後臺設置AutoField爲主鍵,我不確定CharField(使用唯一的3字符代碼)是否適合作爲主鍵或者這是否是次優?django Charfield適合主鍵?

class PaymentMethod(models.Model): 
    unique_id = models.CharField(max_length=3) 
    last_updated = models.DateTimeField(auto_now=True) 

回答

1

沒有什麼錯設置CharField是一個主鍵,通過改變模式是:

class PaymentMethod(models.Model): 
    unique_id = models.CharField(max_length=3, primary_key=True) 
    last_updated = models.DateTimeField(auto_now=True) 

其實不然,如果UNIQUE_ID是您將查詢它使場使用它的完美意義。您的其他選擇是使用現有的模式,但與unique=True

class PaymentMethod(models.Model): 
    unique_id = models.CharField(max_length=3, unique=True) 
    last_updated = models.DateTimeField(auto_now=True) 

在這種情況下,你的主鍵會自動遞增的整數,你前面所述。

另一個選項取決於您希望存儲在PaymentMethod模型中的記錄數;以及數據在您的應用程序中的其他地方使用。太看看使用model choices field。模型選擇字段可能在您的付款或訂單模型上(取決於您的應用程序以及您正在嘗試執行的操作)。這消除了對外鍵的需求,並可能減少應用程序中的查詢數量。

它可能是這個樣子:

class Payment(models.Model): 
    VISA = 'VIS' 
    CREDIT = 'CRE' 
    MASTER_CARD = 'MAS' 
    PAYPAL = 'PAL' 
    PAYMENT_OPTIONS= (
     (VISA, 'Visa'), 
     (CREDIT, 'Credit Card'), 
     (MASTER_CARD, 'Master Card'), 
     (PAYPAL, 'Paypal') 
    ) 

    items = models.ForeignKey(Item) 
    date = models.DateField(auto_now=True) 
    ... 
    payment_method = models.CharField(max_length=3, choices=PAYMENT_OPTIONS, default=VISA) 

PAYMENT_OPTIONS可用於使用Django model forms時呈現的形式下拉框。否則,用戶選擇僅限於此模型中列出的選項。 如果您只有一小部分PaymentMethod(s),則此方法效率會更高。

+0

謝謝我注意到你在選項選項中沒有指定'primary_key = True'。使用選擇是否會使這種冗餘?我只有5個選擇這個領域,所以這可能是一個很好的選擇,但是使用選擇會自動創建一個索引或以另一種方式更高效。我也剛剛看到設置'unique = True'會自動創建一個索引,所以在前兩個選項(主鍵或僅使用唯一)之間有很大的區別? – Yunti

+0

如果您選擇路由,那麼您將在模型中創建一列,您通常將外鍵設置爲PaymentMethod。基本上,在任何地方你可以使用'payment_type = models.ForeignKey(PaymentMethod)',而不是'payment_choice = models.CharField(....,choices = <支付選項>)。基本上不需要PaymentMethod模型。 –

+0

輝煌,這是理想的謝謝。我有另一個類似的模型只有3個選擇,但是可以有多個選項。是否有可能將其納入模型中,還是必須成爲單獨的M2M模型? – Yunti