如何将django默认的ForeignKey类型从整数更改为字符串?

时间:2018-05-19 09:12:55

标签: python django foreign-keys primary-key

class NewStock(models.Model):
    stock_info = models.ForeignKey(Stock)
    stock_xcode = models.CharField(max_length=10, unique=True, primary_key=True)

class Stock(models.Model):
    stock_name = models.CharField(max_length=200)
    stock_id = models.CharField(max_length=10, unique=True, primary_key=True)

在数据库中,将有一个stock_info_id列,其类型为整数。当stock_id0开头时,例如000001,它将是stock_info_id=1,并且无法获得stock_info,因为找不到1 stock_id表格的Stock列。

如何为ForeignKey指定确切的类型。

对于此问题,如果stock_info_id CharField不是Integer,则情况会很好。

更改前的代码如下所示。我没有将stock_idstock_xcode设为primary key。在这种情况下,stock_info_id应为integer

class NewStock(models.Model):
    stock_info = models.ForeignKey(Stock)
    stock_xcode = models.CharField(max_length=10, unique=True)

class Stock(models.Model):
    stock_name = models.CharField(max_length=200)
    stock_id = models.CharField(max_length=10, unique=True)

stock_id设为primary keymakemigrationsmigrate后,stock_info_id仍为integer

迁移文件就在这里。

class Migration(migrations.Migration):

dependencies = [
    ('stockinfo', '0008_auto_20180519_1017'),
]

operations = [
    migrations.RemoveField(
        model_name='newstock',
        name='id',
    ),
    migrations.RemoveField(
        model_name='stock',
        name='id',
    ),
    migrations.AlterField(
        model_name='newstock',
        name='stock_xcode',
        field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True),
    ),
    migrations.AlterField(
        model_name='stock',
        name='stock_id',
        field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True),
    ),
]

所选的db是postgresql。 newstock表。

     name      |           type           | Collation | Nullable | Default
---------------+--------------------------+-----------+----------+---------
 stock_xcode   | character varying(10)    |           | not null |
 stock_info_id | integer                  |           | not null |

stock表。

    name    |          type          | Collation | Nullable | Default
------------+------------------------+-----------+----------+---------
 stock_name | character varying(200) |           | not null |
 stock_id   | character varying(10)  |           | not null |

1 个答案:

答案 0 :(得分:1)

我通过重置数据库解决了这个问题。

  1. python manager.py flush
  2. 删除migrations目录
  3. 下的所有文件
  4. python manager.py makemigrations
  5. python manager.py migrate
  6. 删除整个数据库时价格很高。更好的方法是检查migration个文件并回滚到正确的状态,并从那时起执行migratxxx个操作。