Как изменить Django по умолчанию тип ForeignKey с целого числа на строку? - PullRequest
0 голосов
/ 19 мая 2018
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),
    ),
]

Выбранная база данных - 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 голосов
/ 19 мая 2018

Я исправляю это путем сброса базы данных.

  1. python manager.py flush
  2. удалить все файлы в каталоге migrations
  3. python manager.py makemigrations
  4. python manager.py migrate

Цена высока при удалении всей базы данных.Лучший способ - проверить файлы migration и выполнить откат до нужного состояния и выполнить действия migratxxx с этого момента.

...