Невозможно определить поле ForeignKey в моделях Django - PullRequest
0 голосов
/ 31 марта 2020

Я не могу определить ForeignKey отношение из UsersGroups модели с двумя другими моделями Roles и Users. Выдает ошибку -

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/db/models/fields/related.py", line 786, in __init__
    to._meta.model_name
AttributeError: type object 'Roles' has no attribute '_meta'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/jeetpatel/Desktop/eitan-app/users_and_auth/models.py", line 31, in <module>
    class UsersGroups():
  File "/Users/jeetpatel/Desktop/eitan-app/users_and_auth/models.py", line 33, in UsersGroups
    group_id = models.ForeignKey(Roles, on_delete=models.CASCADE, blank= False)
  File "/Users/jeetpatel/Desktop/env/lib/python3.7/site-packages/django/db/models/fields/related.py", line 792, in __init__
    RECURSIVE_RELATIONSHIP_CONSTANT,
AssertionError: ForeignKey(<class 'users_and_auth.models.Roles'>) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

class Roles():
    group_name = models.CharField(max_length=255, unique=True, blank=False)


class Users(AbstractBaseUser, PermissionsMixin):

    """
    This model is used to store user login credential and profile information.
    It's a custome user model but used for Django's default authentication.
    """

    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=False, null=False)
    last_name = models.CharField(max_length=255, blank=False, null=False)
    profile_picture = models.ImageField(upload_to='profile_pictures/', max_length=None, null=True, blank=True)
    is_active = models.BooleanField(default=True)

    # defing a custome user manager class for the custome user model.
    objects = managers.UserManager()

    # using email a unique identity for the user and it will also allow user to use email while logging in.
    USERNAME_FIELD = 'email'


class UsersGroups():
    user_id = models.ForeignKey(Users, on_delete=models.CASCADE, blank=False)
    group_id = models.ForeignKey(Roles, on_delete=models.CASCADE, blank= False)

Как указано в документации, я предоставил model name в качестве первого аргумента для ForeignKey, а также передал аргумент on_delete=models.CASCADE

1 Ответ

4 голосов
/ 31 марта 2020

Ваш Roles класс UsersGroups тоже) не определен должным образом, необходимо расширить класс Django Model для допустимой модели и использовать его как ForeignKey.

class Roles(models.Model):
    group_name = models.CharField(max_length=255, unique=True, blank=False)

Я также хочу упомянуть о некоторых других проблемах с вашим кодом. 1) Не называйте свои модели во множественном числе. Django ожидайте, что они будут в единственном числе. 2) Когда вы определяете ForeignKey, не используйте xxx_id в качестве имени. Django автоматически создает атрибут xxx_id для вашей модели, так что в итоге вы получите xxx_id_id.

Итак, имея это в виду, ваш код должен действительно выглядеть так:

class Role(models.Model):
    group_name = models.CharField(max_length=255, unique=True, blank=False)


class User(AbstractBaseUser, PermissionsMixin):
    """
    This model is used to store user login credential and profile information.
    It's a custome user model but used for Django's default authentication.
    """

    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=False, null=False)
    last_name = models.CharField(max_length=255, blank=False, null=False)
    profile_picture = models.ImageField(upload_to='profile_pictures/', max_length=None, null=True, blank=True)
    is_active = models.BooleanField(default=True)

    # defing a custome user manager class for the custome user model.
    objects = managers.UserManager()

    # using email a unique identity for the user and it will also allow user to use email while logging in.
    USERNAME_FIELD = 'email'


class UserGroup(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False)
    group = models.ForeignKey(Role, on_delete=models.CASCADE, blank= False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...