#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
ofFinalList
. КаждаяForeignKey
ссылка на соответствующий первичный ключ модели.