使用Django与现有的数据库id字段有问题

时间:2015-06-03 00:36:47

标签: python mysql django database primary-key

我在现有数据库中使用Django。我使用 inspectdb 来创建现有数据库的模型。一切都有效,除了一个重要的细节。似乎Django总是假设有一个 id 字段。例如,当我删除名为 date 的字段时,运行迁移,将从表中删除日期。但是,当我尝试删除 id 字段时,即使实际数据库表中没有id字段,它也会在table_name上显示 -Alter字段ID

那么,如果你想在现有数据库中创建和使用id字段,你是否必须在模型和数据库中手动指定它,或者有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

默认情况下,Django会为您的模型创建id字段,即使您没有指定它,因此,在这种情况下,即使您删除了自动生成的字段:

id = models.IntegerField(primary_key=True)

Django模型将假定存在一个,因此您看到的消息。这是因为 need 有一个主键字段。

所以,是的,您必须通过将primary_key=True属性添加到inspectdb生成的模型上的相应字段来指定主键,否则Django将假设您的主键是列{{1 }}

请注意,如果您决定在表格中添加id列,则shouldn't set it explicitly in your model

  

每个生成的模型都有每个字段的属性,包括id主键字段。但是,请记住,如果模型没有主键,Django会自动添加id主键字段。因此,您需要删除任何看起来像这样的行:

     

id

     

这些行不仅冗余,而且如果您的应用程序将向这些表添加新记录,它们也会导致问题。

如果您决定不这样做,请确保您最终选择的列不是id = models.IntegerField(primary_key=True),也不是重复值。