首页 > 解决方案 > 使用 postgreSQL 在 Django 中设置外键关系

问题描述

我想使用 PostgreSQL 在 Django 中建模以下实体关系:

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

目标和帐户是 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.

我缺少什么设置?非常感谢任何建议或帮助:)

标签: djangopostgresqlentity-relationshipentity-relationship-model

解决方案


推荐阅读