2016-06-30 37 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