Как побороть ошибку ImportError? - PullRequest
0 голосов
/ 07 января 2020

В моем проекте я хочу реализовать пользовательскую модель пользователя, которая включена в мое приложение для пользователей и включена в мои настройки, в которой есть запись для проекта, над которым в данный момент ведется работа. Таким образом, моя пользовательская модель должна выглядеть следующим образом:

from django.db import models
from django.contrib.auth.models import AbstractUser

from api.models import Project


class User(AbstractUser):
    current_project = models.ForeignKey(
        Project,
        on_delete=models.SET_NULL,
        null=True,
    )

Хотя моя модель Project в приложении API в основном выглядит как

from django.db import models

from users.models import User


class Project(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        User,
        on_delete=models.SET_NULL,
        null=True,
        related_name="api_project_author",
        related_query_name="api_project_authors"
    )
    edited_at = models.DateTimeField(blank=True, null=True)
    editor = models.ForeignKey(
        User,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="api_project_editor",
        related_query_name="api_project_editors"
    )

Однако, если я запускаю это, я получаю ImportError: не могу импортировать имя 'User' из 'users.models' , что, очевидно, происходит из-за ссылки в моей модели User, которая затем пытается импортировать модель User из-за ее других ссылок. Поэтому моя идея состояла в том, чтобы создать новую модель UserSetting в приложении API, например

class UserSetting(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True)

Однако я не уверен, как правильно решать подобные проблемы или избегать их.

Я использую Django 2,2 и Python 3,7,3

1 Ответ

0 голосов
/ 07 января 2020

Поэтому, когда вы пытаетесь использовать пользовательскую модель в отношении, согласно документам , вы должны ссылаться на нее через settings.AUTH_USER_MODEL. Это должно быть установлено, если вы следовали официальному руководству по использованию пользовательских пользовательских моделей здесь .

РЕДАКТИРОВАТЬ:

Таким образом, ваш код в конечном итоге будет выглядеть так:

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    current_project = models.ForeignKey(
        'api.Project',
        on_delete=models.SET_NULL,
        null=True,
    )
from django.conf import settings
from django.db import models


class Project(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        related_name="api_project_author",
        related_query_name="api_project_authors"
    )
    edited_at = models.DateTimeField(blank=True, null=True)
    editor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="api_project_editor",
        related_query_name="api_project_editors"
    )

При ссылке на вашу пользовательскую модель вы фактически используете строку, заданную в ваших конфигах. Django отсортирует ссылки на правильную модель для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...