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_id
以0
开头时,例如000001
,它将是stock_info_id=1
,并且无法获得stock_info
,因为找不到1
stock_id
表格的Stock
列。
如何为ForeignKey
指定确切的类型。
对于此问题,如果stock_info_id
CharField
不是Integer
,则情况会很好。
更改前的代码如下所示。我没有将stock_id
和stock_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 key
,makemigrations
和migrate
后,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 |
答案 0 :(得分:1)
我通过重置数据库解决了这个问题。
python manager.py flush
migrations
目录python manager.py makemigrations
python manager.py migrate
删除整个数据库时价格很高。更好的方法是检查migration
个文件并回滚到正确的状态,并从那时起执行migratxxx
个操作。