Как изменить тип данных поля модели 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 это внешние ключи, поэтому это будут только целые числа.

Пожалуйста, проверьте в специальных таблицах, вы получите правильный тип.

В коде вы можете получить доступ к этим значениям, используя имя внешнего ключа

Вернуться на верх