Невозможно добавить два внешних ключа в модель пользователя в django - PullRequest
0 голосов
/ 14 октября 2019

У меня есть пользовательская модель, которую я расширил для хранения дополнительной информации. Теперь у меня есть таблица отделов, в которой есть два ключа (внешний), которые будут связаны со столбцами в пользовательской таблице. Но я получаю сообщение об ошибке.

Это то, что я пробовал

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) эта строка. Все отлично работаетМожет кто-нибудь сказать мне, где я иду не так. Эта проблема возникла только тогда, когда я добавил модель отделов в свою базу данных, в противном случае модель пользователя работает отлично.

РЕДАКТИРОВАТЬ: Как указано в комментариях, я запутался между to_field иrelated_name. Я перепутал related_name с to_field в моделях.

1 Ответ

1 голос
/ 14 октября 2019

Как говорится в сообщении об ошибке, related_name для Profile.manager_username конфликтует с именем для Department.tech_lead. Измените один из них так, чтобы он не совпадал.

(Хотя я должен сказать, что ваше моделирование довольно странно. Конечно, технический руководитель не может отвечать за более чем один отдел? Так что отношения должныбыть один к одному. А зачем явно связывать профиль с менеджером, а не с отделом?)

...