django Charfield 适合作为主键吗?

Yun*_*nti 11 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)
Run Code Online (Sandbox Code Playgroud)

Mat*_*our 11

CharField通过将模型更改为,将设置为主键并没有错:

class PaymentMethod(models.Model):
    unique_id = models.CharField(max_length=3, primary_key=True)
    last_updated = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

实际上,如果 unique_id 是您要查询的字段,那么使用它就非常有意义。您的其他选择是使用您现有的模型,但具有unique=True

class PaymentMethod(models.Model):
    unique_id = models.CharField(max_length=3, unique=True)
    last_updated = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的主键将是您之前所述的自动递增整数。

另一个选项取决于您希望在PaymentMethod模型中存储的记录数量;以及数据在应用程序中的其他地方使用的位置。正在考虑使用模型选择字段。模型选择字段可能位于您的付款或订单模型上(取决于您的应用程序和您尝试执行的操作)。这消除了对外键的需要,并可能减少应用程序中的查询数量。

它可能看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

PAYMENT_OPTIONS可用于使用Django时呈现的形式下拉框模型的形式。否则,用户的选择仅限于此模型中列出的选项。如果您只有一小部分PaymentMethod(s).


joz*_*ozo 6

可以用CharField作主键。您只需将该字段标记为主键。

field_name = models.CharField(primary_key=True, max_length=100)
Run Code Online (Sandbox Code Playgroud)

但我不会推荐它,因为:

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