Как изменить тип данных поля модели Django
У меня есть набор моделей django следующего вида
class FirstCategory(models.Model):
first_category = models.CharField(max_length=200)
def __str__(self):
return self.first_category
class SecondCategory(models.Model):
first_category = models.ForeignKey(FirstCategory, on_delete=models.CASCADE)
second_category = models.CharField(max_length=200)
def __str__(self):
return self.second_category
class ThirdCategory(models.Model):
first_category = models.ForeignKey(FirstCategory, on_delete=models.CASCADE)
second_category = models.ForeignKey(SecondCategory, on_delete=models.CASCADE)
third_category = models.CharField(max_length=200)
def __str__(self):
return self.third_category
class FinalList(models.Model):
unique_number = models.BigIntegerField()
name = models.CharField(max_length=200)
first_category = models.ForeignKey(FirstCategory, on_delete=models.SET_NULL, null=True, db_column="first_category")
second_category = models.ForeignKey(SecondCategory, on_delete=models.SET_NULL, null=True, db_column="second_category")
third_category = models.ForeignKey(ThirdCategory, on_delete=models.SET_NULL, null=True, db_column="third_category")
def __str__(self):
return self.name
Когда я переношу модели и проверяю типы данных полей в таблице FinalList
я получаю следующее
column_name | data_type
---------------------------+-------------------
third_category | bigint
first_category | bigint
second_category | bigint
unique_number | bigint
name | character varying
Я указал первую, вторую и третью категории как поля Character. Почему оно переносится как BigInt?
Я пытаюсь реализовать цепочку выпадающих элементов в моей форме. Я следую руководству SimpleBetterThanComplex для этого
Редактирование 1: содержимое файла миграции
В файле миграции у меня есть следующее
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
Я не указываю это сам. Я думаю, что Django создает это как автоматическое первичное поле. Может ли это влиять на типы данных ForeignKeys
?
Django сам создает первичный ключ для каждой модели, автоматически называемый id
: https://docs.djangoproject.com/en/3.2/topics/db/models/#automatic-primary-key-fields
Когда вы создаете ForeignKey
, Django создает новое поле, которое указывает на связанный первичный ключ модели (автоматический id в вашем случае). Вы можете указать другой первичный ключ с помощью аргумента primary_key=True
в поле.
class FirstCategory(models.Model):
first_category = models.CharField(max_length=200, primary_key=True)
def __str__(self):
return self.first_category
Дополнительно, Django предоставляет свойство pk
shortcut для доступа к первичному ключу в модели, независимо от того, указан он автоматически или вручную.
Вы проверяете тип данных в таблице FinalList,
В таблице FinalList first_category, second_category, third_category это внешние ключи, поэтому это будут только целые числа.
Пожалуйста, проверьте в специальных таблицах, вы получите правильный тип.
В коде вы можете получить доступ к этим значениям, используя имя внешнего ключа