Дублирование имени столбца при выполнении тестов в Django

У меня проблема с моим кодом. Мой друг помог мне написать код на JavaScript, но чтобы сделать эту часть кода, ему пришлось добавить поле с опцией "db_column". После того как он это сделал, когда я запускаю тесты, у меня возникает ошибка: "дублируется имя столбца: ID". Теперь мой друг больше не может мне помочь, а я не могу найти решение этой проблемы...

Вот models.py:

class Item(models.Model):
name = models.CharField(max_length=50)
type = models.CharField(max_length=50, validators=[RegexValidator('helmet|torso|pants|gauntlets|weapon|accessory')])
bonus = models.ForeignKey(Statistics, on_delete=models.CASCADE)
durability = models.IntegerField()
image = models.ImageField(upload_to='DeepDungeon/static/images/items')
itemId = models.IntegerField(db_column='ID')

А вот и ошибка:

Creating test database for alias 'default'...
Traceback (most recent call last):
  File "/Users/manuel/Programmazione/PyCharm/DeepDungeon/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
  File "/Users/manuel/Programmazione/PyCharm/DeepDungeon/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 421, in execute
    return Database.Cursor.execute(self, query)
sqlite3.OperationalError: duplicate column name: ID

За сценой django автоматически добавляет поле ID, которое является первичным ключом модели, поэтому при добавлении db_column="ID" на itemId происходит столкновение с первичным ключом модели Item. Вы можете исправить это двумя способами:

class Item(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50, validators=[RegexValidator('helmet|torso|pants|gauntlets|weapon|accessory')])
    bonus = models.ForeignKey(Statistics, on_delete=models.CASCADE)
    durability = models.IntegerField()
    image = models.ImageField(upload_to='DeepDungeon/static/images/items')
    # add primary key on the itemId if you know that this always will be unique
    itemId = models.IntegerField(db_column='ID', primary_key=True)
    # OR, define a new primary key
    pk = models.AutoField(primary_key=True)
Вернуться на верх