более одной ошибки первичного ключа в django

У меня проблема с двумя моими моделями. При попытке миграции всегда возникает ошибка, что у меня более одного первичного ключа. Я гуглил и пробовал много разных решений, но ничего не работает.

модели: обратите внимание на импорт

from django.db.models import Model,CharField,EmailField,IntegerField,\
     OneToOneField,CASCADE,DateTimeField,ForeignKey,BooleanField,\
     IntegerField,SlugField
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from phone_field import PhoneField
from datetime import datetime
from pdb import set_trace as B

class Adress(Model):

    street=CharField(default='',max_length=100)
    snumb=CharField(default='',max_length=15)
    town=CharField(default='',max_length=100)
    postn=CharField(default='',max_length=5,validators=[postnvali])
    
    def __str__(self):
        return 'city: ' + self.town

    class Meta:
        ordering=('street','town')

class Person(Model):

    fname=CharField(default="",max_length=100)
    lname=CharField(default="",max_length=100)
    mobil=PhoneField(default='9999999999')
    mail=EmailField(default='[email protected]')
    padress=OneToOneField(Adress,on_delete=CASCADE)

    def __str__(self):
        return 'person: ' + self.fname

    class Meta:
        ordering=('fname','lname')

файл миграции:

# Generated by Django 3.1.4 on 2021-01-20 13:32

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('kammem', '0029_auto_20210120_1354'),
    ]

    operations = [
        migrations.AddField(
            model_name='person',
            name='id',
            field=models.AutoField(auto_created=True,serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
        migrations.AlterField(
            model_name='person',
            name='padress',
            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='kammem.adress'),
        ),
    ]

person Jonas Fredriksson    schedule 20.01.2021    source источник
comment
Ваши миграции говорят, что вы добавляете поле id в свою модель Person, это поле уже существует вместе с полем pk, которое можно использовать как первичные ключи, не так ли в вашей реальной модели? И можете ли вы показать полную трассировку ошибок?   -  person SLDem    schedule 20.01.2021
comment
его нет в моей модели.   -  person Jonas Fredriksson    schedule 20.01.2021
comment
покажи трассировку тогда   -  person SLDem    schedule 20.01.2021
comment
короткая трассировка ошибок: (не может опубликовать все) return Database.Cursor.execute(self, query) django.db.utils.OperationalError: таблица new__kammem_person имеет более одного первичного ключа   -  person Jonas Fredriksson    schedule 20.01.2021
comment
разместил это ниже   -  person Jonas Fredriksson    schedule 20.01.2021
comment
на самом деле вы можете редактировать свои собственные вопросы, в следующий раз сделайте это :) я проверю это   -  person SLDem    schedule 20.01.2021
comment
извините, приятель, понятия не имею, в чем проблема, попробуйте удалить ВСЕ ваши миграции, а затем запустите их снова, ясно, что когда вы выполняете миграцию, вы добавляете AutoField, который представляет собой тип поля, который по умолчанию делает себя первичным ключом, и это является причиной ваша ошибка в том, почему он добавляет ее, хотя я не знаю, не похоже, что она есть ни в одной из ваших моделей   -  person SLDem    schedule 21.01.2021


Ответы (3)


Попробуйте изменить свой файл миграции на этот, а затем запустите migrate:

from django.db import migrations, models
import django.db.models.deletion

class Migration(migrations.Migration):

    dependencies = [
        ('kammem', '0029_auto_20210120_1354'),
    ]

    operations = [
        migrations.AlterField(
            model_name='person',
            name='padress',
            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='kammem.adress'),
        ),
    ]
person SLDem    schedule 20.01.2021
comment
это дает ту же ошибку: return Database.Cursor.execute(self, query) django.db.utils.OperationalError: таблица new__kammem_person имеет более одного первичного ключа - person Jonas Fredriksson; 20.01.2021
comment
являются ли модели, о которых идет речь, точно такими же, как у вас в коде? - person SLDem; 20.01.2021
comment
да они такие же - person Jonas Fredriksson; 20.01.2021
comment
еще одна вещь, которую я заметил, ваши модели не наследуются от базового класса django models.Model, попробуйте изменить это и добавить в свои отношения, где у вас есть on_delete=models.CASCADE, также добавьте его - person SLDem; 20.01.2021
comment
они есть, я включил импорт в приведенные выше модели для ясности - person Jonas Fredriksson; 20.01.2021
comment
попробуйте удалить свои миграции, а затем снова создать и выполнить миграцию - person SLDem; 20.01.2021
comment
та же ошибка... сначала запрашивается значение по умолчанию, а затем в таблице new__kammem_person имеется более одной ошибки первичного ключа - person Jonas Fredriksson; 20.01.2021
comment
Добавьте полную трассировку ошибок к вашему вопросу, пожалуйста - person SLDem; 20.01.2021

хорошо, вот полная трассировка ошибок:

[email protected] kammem $ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, kammem, sessions
Running migrations:
  Applying kammem.0025_auto_20210120_0935...Traceback (most recent call last):
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 411, in execute
    return Database.Cursor.execute(self, query)
sqlite3.OperationalError: table "new__kammem_person" has more than one primary key

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/jonas/Dropbox/prog/web/django/kammem/manage.py", line 22, in <module>
    main()
  File "/home/jonas/Dropbox/prog/web/django/kammem/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 243, in handle
    post_migrate_state = executor.migrate(
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/migrations/executor.py", line 227, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/migrations/migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/migrations/operations/fields.py", line 236, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/sqlite3/schema.py", line 138, in alter_field
    super().alter_field(model, old_field, new_field, strict=strict)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 571, in alter_field
    self._alter_field(model, old_field, new_field, old_type, new_type,
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/sqlite3/schema.py", line 360, in _alter_field
    self._remake_table(model, alter_field=(old_field, new_field))
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/sqlite3/schema.py", line 280, in _remake_table
    self.create_model(new_model)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 324, in create_model
    self.execute(sql, params or None)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 142, in execute
    cursor.execute(sql, params)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
    return super().execute(sql, params)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
  File "/home/jonas/.local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 411, in execute
    return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: table "new__kammem_person" has more than one primary key
person Jonas Fredriksson    schedule 20.01.2021

хорошо, я думаю, что решил это, просто удалив все файлы миграции, а затем повторно запустив make миграции и миграцию. Тем не менее, согласно моим поискам в Google, это распространенная проблема.

person Jonas Fredriksson    schedule 20.01.2021