Py学习  »  Django

Django模型错误:无法解析相关模型

M. R. Chuck • 3 年前 • 269 次点击  

假设这个模型:

from django.db import models


class DeviceInfo(models.Model):
    device_id = models.IntegerField(primary_key=True)

    def __str__(self):
        return str(self.device_id)


class CenterCommands(models.Model):
    device_object = models.ForeignKey(
        DeviceInfo, on_delete=models.CASCADE)
    command = models.CharField(max_length=512)

    def __str__(self):
        return str(self.device_object.device_id)


class CenterCommandsRawData(models.Model):
    center_command = models.OneToOneField(
        CenterCommands, on_delete=models.CASCADE, primary_key=True)
    data = models.CharField(max_length=512)

    def __str__(self):
        return str(self.center_command.device_object.device_id)

python manage.py makemigrations deviceApp python manage.py migrate ,我得到以下错误:

(myDjangoEnv) $>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, deviceApp, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying deviceApp.0001_initial...Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\core\management\commands\migrate.py", line 234, in handle
    fake_initial=fake_initial,
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\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 "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\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 "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\migrations\executor.py", line 245, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\migrations\operations\models.py", line 92, in database_forwards
    schema_editor.create_model(model)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\backends\base\schema.py", line 257, in create_model
    definition, extra_params = self.column_sql(model, field)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\backends\base\schema.py", line 150, in column_sql
    db_params = field.db_parameters(connection=self.connection)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 966, in db_parameters
    return {"type": self.db_type(connection), "check": self.db_check(connection)}
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 963, in db_type
    return self.target_field.rel_db_type(connection=connection)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 878, in target_field
    return self.foreign_related_fields[0]
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 632, in foreign_related_fields
    return tuple(rhs_field for lhs_field, rhs_field in self.related_fields if rhs_field)
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 619, in related_fields
    self._related_fields = self.resolve_related_fields()
  File "C:\Users\Masoud\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related.py", line 604, in resolve_related_fields
    raise ValueError('Related model %r cannot be resolved' % self.remote_field.model)
ValueError: Related model 'deviceApp.CenterCommands' cannot be resolved

以下是迁移文件:

# Generated by Django 2.2.3 on 2019-08-21 08:29

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


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='DeviceInfo',
            fields=[
                ('device_id', models.IntegerField(primary_key=True, serialize=False)),
            ],
        ),
        migrations.CreateModel(
            name='CenterCommandsRawData',
            fields=[
                ('center_command', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='deviceApp.CenterCommands')),
                ('data', models.CharField(max_length=512)),
            ],
        ),
        migrations.CreateModel(
            name='CenterCommands',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('device_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deviceApp.DeviceInfo')),
            ],
        ),
    ]

编辑:如注释中所述,可以通过手动更改迁移文件中模型的顺序来解决此问题。但我在想为什么会这样?我的模型定义正确吗? 我认为手动编辑迁移文件不是这里最好的选择。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/57199
 
269 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Thrilok Kumar Pallaki
Reply   •   1 楼
Thrilok Kumar Pallaki    4 年前

尝试像这样交换最后两次迁移:

migrations.CreateModel(
name='CenterCommands',
fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    ('device_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='deviceApp.DeviceInfo')),
],
),
migrations.CreateModel(
name='CenterCommandsRawData',
    fields=[
        ('center_command', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='deviceApp.CenterCommands')),
        ('data', models.CharField(max_length=512)),
    ],
 ),