ValueError:无法解析相关模型“ user.UserProfile”

时间:2018-11-10 19:09:48

标签: python django python-3.x django-models

我正在尝试在用户应用程序中创建UserProfile模型,而不是从django自己的models.Model模型继承,而不是从User继承,这样我将拥有一个自定义用户带额外字段的模型。但是当我运行python manage.py test命令时,它给了我以下错误:

    Creating test database for alias 'default'...
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\commands\test.py", line 26, in run_from_argv
    super().run_from_argv(argv)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\commands\test.py", line 56, in handle
    failures = test_runner.run_tests(test_labels)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\test\runner.py", line 604, in run_tests
    old_config = self.setup_databases()
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\test\runner.py", line 551, in setup_databases
    self.parallel, **kwargs
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\test\utils.py", line 174, in setup_databases
    serialize=connection.settings_dict.get('TEST', {}).get('SERIALIZE', True),
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\db\backends\base\creation.py", line 68, in create_test_db
    run_syncdb=True,
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\__init__.py", line 148, in call_command
    return command.execute(*args, **defaults)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\core\management\commands\migrate.py", line 203, in handle
    fake_initial=fake_initial,
  File "C:\Users\User\AppData\Local\Programs\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\User\AppData\Local\Programs\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\User\AppData\Local\Programs\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\User\AppData\Local\Programs\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\User\AppData\Local\Programs\lib\site-packages\django\db\migrations\operations\fields.py", line 216, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\db\backends\sqlite3\schema.py", line 127, in alter_field
    super().alter_field(model, old_field, new_field, strict=strict)
  File "C:\Users\User\AppData\Local\Programs\lib\site-packages\django\db\backends\base\schema.py", line 495, in alter_field
    new_db_params = new_field.db_parameters(connection=self.connection)
  File "C:\Users\User\AppData\Local\Programs\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\User\AppData\Local\Programs\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\User\AppData\Local\Programs\lib\site-packages\django\db\models\fields\related.py", line 878, in target_field
    return self.foreign_related_fields[0]
  File "C:\Users\User\AppData\Local\Programs\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\User\AppData\Local\Programs\lib\site-packages\django\db\models\fields\related.py", line 619, in related_fields
    self._related_fields = self.resolve_related_fields()
  File "C:\Users\User\AppData\Local\Programs\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 'user.UserProfile' cannot be resolved

这是我的models.py的样子。

class UserProfile(User):
    levels = [
        ('Beginner', 'Beginner'),
        ('Elementary', 'Elementary'),
        ('Pre-Intermediate', 'Pre-Intermediate'),
        ('Intermediate', 'Intermediate'),
        ('Upper-Intermediate', 'Upper-Intermediate'),
        ('Advanced', 'Advanced'),
    ]

    courses = [
        ('English', 'English'),
        ('Russian', 'Russian'),
        ('Mathematics', 'Mathematics'),

    ]

    titles = [
        ('Teacher', 'Teacher'),
        ('Student', 'Student'),
    ]

    icons = [
        ('fa-user', 'User'),
        ('fa-user-graduate', 'Student'),
        ('fa-user-ninja', 'Ninja'),
        ('fa-user-tie', 'Tie'),
        ('fa-user-md', 'Doctor'),
        ('fa-user-astronaut', 'Astronaut'),
        ('fa-user-secret', 'Spy'),
        ('fa-user-injured', 'Injured'),
    ]

    bio = models.TextField(blank=True)
    country = models.CharField(max_length = 100)
    course = models.CharField(
        max_length = 20,
        choices=courses,
        default='English',
    )
    level = models.CharField(
        max_length = 20,
        choices=levels,
        default='Beginner',
    )
    title = models.CharField(
        max_length = 20,
        choices=titles,
        default='Student',
    )
    avatar = models.ImageField(default='avatars/default_avatar.jpg', upload_to='avatars')
    icon = models.CharField(
        max_length = 150,
        choices = icons,
        default = 'fa-user'
    )


    def is_student(self):
        return self.title == 'Student'


    def is_teacher(self):
        return self.title == 'Teacher'

    def get_absolute_url(self):
        return reverse('user-profile', kwargs={'slug': self.username})

    def __str__(self):
        return f'{self.username} Profile'

    def save(self, **kwargs):
        super().save()

        img = Image.open(self.avatar.path)

        if img.height != img.width:
            w = img.width
            h = img.height

            if h > w:
                a = h - w
                box = (a/2, a/2, w, w)
            else:
                a = w - h
                box = (a/2, a/2, h, h)

            img = img.crop(box)

            if img.height > 500 or img.width > 500:
                output_size = (500, 500)
                img.thumbnail(output_size)
                img.save(self.avatar.path)
            else:
                img.save(self.avatar.path)

我已将其添加到settings.py

1 个答案:

答案 0 :(得分:0)

我发现了问题所在!

这是因为我将UserProfile应用中的user模型用作ForeignKey的另一个模型Post的作者,而问题却在那里。事实证明,直接从另一个应用程序导入模型并将其传递到那里会产生此类错误。因此,请按照此处的文档https://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.ForeignKey

我在另一个应用中创建了另一个名为User的模型,并继承自我的UserProfile,这是我的 jollywood / models.py 的外观:

    from django.db import models
from django.utils import timezone
from user.models import UserProfile


class Post(models.Model):
    title = models.CharField(max_length = 150)
    auth = models.ForeignKey('User', on_delete=models.CASCADE)
    content_shown = models.TextField()
    content_hidden = models.TextField()
    date = models.DateTimeField(default=timezone.now)
    read = models.PositiveIntegerField()
    liked = models.PositiveIntegerField()
    thumbnail = models.ImageField(default='post_thumbs/default_thumb.jpg', upload_to='post_thumbs')


    def __str__(self):
        return self.title

class User(UserProfile):
    pass

这是我的 user / models.py 的样子:

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.urls import reverse


class UserProfile(User):
    levels = [
        ('Beginner', 'Beginner'),
        ('Elementary', 'Elementary'),
        ('Pre-Intermediate', 'Pre-Intermediate'),
        ('Intermediate', 'Intermediate'),
        ('Upper-Intermediate', 'Upper-Intermediate'),
        ('Advanced', 'Advanced'),
    ]

    courses = [
        ('English', 'English'),
        ('Russian', 'Russian'),
        ('Mathematics', 'Mathematics'),

    ]

    titles = [
        ('Teacher', 'Teacher'),
        ('Student', 'Student'),
    ]

    icons = [
        ('fa-user', 'User'),
        ('fa-user-graduate', 'Student'),
        ('fa-user-ninja', 'Ninja'),
        ('fa-user-tie', 'Tie'),
        ('fa-user-md', 'Doctor'),
        ('fa-user-astronaut', 'Astronaut'),
        ('fa-user-secret', 'Spy'),
        ('fa-user-injured', 'Injured'),
    ]

    bio = models.TextField(blank=True)
    country = models.CharField(max_length = 100)
    course = models.CharField(
        max_length = 20,
        choices=courses,
        default='English',
    )
    level = models.CharField(
        max_length = 20,
        choices=levels,
        default='Beginner',
    )
    title = models.CharField(
        max_length = 20,
        choices=titles,
        default='Student',
    )
    avatar = models.ImageField(default='avatars/default_avatar.jpg', upload_to='avatars')
    icon = models.CharField(
        max_length = 150,
        choices = icons,
        default = 'fa-user'
    )
    instagram = models.CharField(max_length = 100, null=True)
    facebook = models.CharField(max_length = 100, null=True)
    twitter = models.CharField(max_length = 100, null=True)
    telegram = models.CharField(max_length = 100, null=True)

    def is_student(self):
        return self.title == 'Student'


    def is_teacher(self):
        return self.title == 'Teacher'

    def get_absolute_url(self):
        return reverse('user-profile', kwargs={'slug': self.username})

    def __str__(self):
        return f'{self.username} Profile'

    def save(self, **kwargs):
        super().save()

        img = Image.open(self.avatar.path)

        if img.height != img.width:
            w = img.width
            h = img.height

            if h > w:
                a = h - w
                box = (a/2, a/2, w, w)
            else:
                a = w - h
                box = (a/2, a/2, h, h)

            img = img.crop(box)

            if img.height > 500 or img.width > 500:
                output_size = (500, 500)
                img.thumbnail(output_size)
                img.save(self.avatar.path)
            else:
                img.save(self.avatar.path)
相关问题