Установка отношения внешнего ключа в Django с использованием postgreSQL - PullRequest
0 голосов
/ 09 марта 2020

Я хочу смоделировать следующие отношения сущностей в Django, используя PostgreSQL:

  ---------                 ------------------                 --------------- 
 |objective|----1:Many---- |userToObjective| ----Many:1----|acounts_account|
  ---------                 ------------------                 --------------- 

Objective и Accounts - это 2 разных приложения Django, и я использую этот код для создания своей таблицы структура данных:

# models.py Objective
from django.contrib.auth import get_user_model

# Import the user model from the Accounts application
User = get_user_model()

class Objective(models.Model):
    id              = models.AutoField(primary_key=True)
    objective       = models.CharField(null=False, max_length=60)
    initial_date    = models.DateField(default=timezone.now(), null=False)
    expiration_date = models.DateField()
    users           = models.ManyToManyField(User, through='UserToObjective', through_fields=('user','objective'), related_name='objectives')


class UserToObjective(models.Model):
    id        = models.AutoField(primary_key=True)
    user      = models.ForeignKey(User, db_column='id', on_delete = models.PROTECT)
    objective = models.ForeignKey(Objective, db_column='id', on_delete = models.PROTECT)


-----------------------------------------------------------------------------------
# models.py Accounts

class Account(AbstractBaseUser):
    id           = models.AutoField(primary_key=True)
    email        = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username     = models.CharField(max_length=30, unique=True)
    last_login   = models.DateTimeField(verbose_name='last login', auto_now=True)
    date_joined  = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    is_admin     = models.BooleanField(default=False)
    is_active    = models.BooleanField(default=True)
    is_staff     = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username']
    objects = MyAccountManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

-----------------------------------------------------------------------------------

Однако, когда я применил миграции с python manage.py makemigrations, я обнаружил следующую ошибку:

objective.Objective.users: (fields.E339) 'UserToObjective.objective' is not a foreign key to 'Account'.
HINT: Did you mean one of the following foreign keys to 'Account': user?
objective.Objective.users: (fields.E339) 'UserToObjective.user' is not a foreign key to 'Objective'.
HINT: Did you mean one of the following foreign keys to 'Objective': objective?
objective.UserToObjective: (models.E007) Field 'objective' has column name 'id' that is used by another field.
HINT: Specify a 'db_column' for the field.
objective.UserToObjective: (models.E007) Field 'user' has column name 'id' that is used by another field.
HINT: Specify a 'db_column' for the field.

Какие настройки мне не хватает? Любой совет или помощь с благодарностью:)

...