Как изменить тип данных поля модели Django

#python #django #django-models #django-forms

#python #django #django-модели #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
 

Я указал первую, вторую и третью категории в качестве символьных полей. Почему он переносится как BigInt?

Я пытаюсь реализовать цепной выпадающий список в своей форме. Для этого я следую простому руководству betterthancomplex

Редактирование 1: содержимое файла миграции

В файле миграции у меня есть следующее

 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
 

Я сам этого не уточняю. Я думаю, что Django создает это как автоматическое основное поле. Может ли это повлиять на типы ForeignKeys данных?

Комментарии:

1. Не могли бы вы проверить свой последний файл миграции, изменился ли тип данных или нет?

2. @Mythilydevaraj Я попытался удалить все миграции и снова мигрировал. Я получаю тот же результат

3. Вы запускали команду migrate после makemigrations? Не могли бы вы поделиться файлом миграции, только конкретными полями

4. @Mythilydevaraj Я отредактировал вопрос. Должен ли я добавить весь файл миграции?

5. Первичный ключ генерируется автоматически, он не влияет на типы данных.

Ответ №1:

Django сам создает первичный ключ для каждой модели с автоматическим именем id : https://docs.djangoproject.com/en/3.2/topics/db/models/#automatic-primary-key-fields

Когда вы создаете a ForeignKey , Django создает новое поле, которое указывает на связанный первичный ключ модели (автоматический идентификатор в вашем случае). Вы можете указать другой первичный ключ с 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 для доступа к первичному ключу в модели, независимо от того, задан ли он автоматически или вручную.

Комментарии:

1. Нужно ли добавлять первичный ключ также ко второй и третьей моделям категории? Или добавление этого в firstcategory изменит и другие модели?

2. @Sashaank, вы должны добавить это к другим моделям ( SecondCategory , ThirdCategory ), чтобы использовать его CharField в ForeingKeys of FinalList . Каждая ForeignKey ссылка на соответствующий первичный ключ модели.