【问题标题】:Unable to add two foreign keys to the user model in django无法在 django 中向用户模型添加两个外键
【发布时间】:2019-10-14 20:22:31
【问题描述】:

我有一个用户模型,我已经扩展它来存储额外的信息。现在我有一个部门表,它有两个键(外键),它们将与用户表中的列相关。但是我遇到了一个错误。

这是我尝试过的

models.py

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

from django.db.models.signals import post_save
from django.dispatch import receiver
# Create your models here.

class Profile(models.Model):
    STATUS_CHOICES = (
    (1, ("Permanent")),
    (2, ("Temporary")),
    )
    GENDER_CHOICES = (
    (1, ("Male")),
    (2, ("Female")),
    (3, ("Not Specified"))
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    emp_type = models.IntegerField(choices=STATUS_CHOICES, default=1)
    contact = models.CharField(max_length=13, blank=True)
    whatsapp = models.CharField(max_length=13, blank=True)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=3)
    avatar = models.ImageField(upload_to='users/images', default='users/images/default.jpg')
    manager_username = models.ForeignKey(User, blank=True, null=True, related_name='usernames', on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.user.username


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()


class Department(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20, unique=True)
    manager = models.ForeignKey(User, blank=True, null=True, related_name='manager_usernames', on_delete=models.DO_NOTHING)

    tech_lead = models.ForeignKey(User, blank=True, null=True, related_name='usernames', on_delete=models.DO_NOTHING)

错误信息 错误:

users.Department.tech_lead: (fields.E304) Reverse accessor for 'Department.tech_lead' clashes with reverse accessor for 'Profile.manager_username'.
        HINT: Add or change a related_name argument to the definition for 'Department.tech_lead' or 'Profile.manager_username'.
users.Department.tech_lead: (fields.E305) Reverse query name for 'Department.tech_lead' clashes with reverse query name for 'Profile.manager_username'.
        HINT: Add or change a related_name argument to the definition for 'Department.tech_lead' or 'Profile.manager_username'.
users.Profile.manager_username: (fields.E304) Reverse accessor for 'Profile.manager_username' clashes with reverse accessor for 'Department.tech_lead'.
        HINT: Add or change a related_name argument to the definition for 'Profile.manager_username' or 'Department.tech_lead'.
users.Profile.manager_username: (fields.E305) Reverse query name for 'Profile.manager_username' clashes with reverse query name for 'Department.tech_lead'.
        HINT: Add or change a related_name argument to the definition for 'Profile.manager_username' or 'Department.tech_lead'.

但当我是tech_lead = models.ForeignKey(User, blank=True, null=True, related_name='usernames', on_delete=models.DO_NOTHING) 时,这一行。一切正常。谁能告诉我哪里出错了。仅当我在数据库中添加部门模型时才会出现此问题,否则用户模型运行良好。

编辑: 正如 cmets 中所指出的,我在 to_fieldrelated_name 之间感到困惑。我将模型中的 related_name 与 to_field 混淆了。

【问题讨论】:

    标签: python django django-models backend django-users


    【解决方案1】:

    正如错误所说,Profile.manager_username 的相关名称与 Department.tech_lead 的名称发生冲突。更改其中一个,使它们不一样。

    (虽然我必须说,你的建模很奇怪。当然,技术主管不能负责多个部门?所以这种关系应该是一对一的。为什么要明确地将个人资料链接到经理,而不是一个部门?)

    【讨论】:

    • 我如何指定与另一个表中的列相关的外键?我认为related_name 也一样。
    • 我不明白你的意思。 ForeignKey 是指向另一个模型的字段。 related_name 是允许您从其他模型返回到此模型的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2016-01-23
    • 2015-12-21
    • 2021-08-25
    • 2013-04-21
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多