django Charfield适合主键吗?

时间:2016-06-30 07:52:56

标签: django-models

在我的django模型中,我想将下面的字段unique_id设置为主键,因为这将是模型查询中使用的字段。它满足unique=Truenull=False。但是,由于django在后台将AutoField设置为主键,因此我不确定CharField(使用唯一的3字符代码)是否适合作为主键,或者这是否是次优的?

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

2 个答案:

答案 0 :(得分:2)

通过将模型更改为:{/ p>,将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)

使用django model forms时,PAYMENT_OPTIONS可用于在表单上呈现下拉框。否则,用户选择仅限于此模型中列出的选项。 如果您只有一小部分PaymentMethod(s),那么这种方法会更有效率。

答案 1 :(得分:1)

可以使用CharField作为主键。您只需指定字段作为主键即可。

field_name = models.CharField(primary_key=True)

但是我不推荐,因为:

  • 主键用于url中(通常在Rest API中使用)-但url中不允许所有字符
  • DRF(django-rest-framework)使用的网址格式默认不会捕获某些字符(例如“。”)。
  • 主键必须唯一-如果字段是字符串,则很难完成,尤其是当您让用户定义它时