在我的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)
答案 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)
但是我不推荐,因为: