在我的 Django 模型中,我想将unique_id下面的字段设置为主键,因为这将是模型查询中使用的字段。它满足unique=True和null=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).
可以用CharField作主键。您只需将该字段标记为主键。
field_name = models.CharField(primary_key=True, max_length=100)
Run Code Online (Sandbox Code Playgroud)
但我不会推荐它,因为:
| 归档时间: |
|
| 查看次数: |
9766 次 |
| 最近记录: |