IntegrityError (1452, «Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа) - PullRequest
0 голосов
/ 22 апреля 2020

Я использую пользовательскую модель пользователя (следуя этому учебному пособию) и все работает хорошо.

Когда я вошел в систему с учетной записью администратора, которую я создал с помощью createuperuser в / Сеанс администратора. Я могу добавлять / удалять / редактировать все, что захочу.

Когда я вошел в систему с другим пользователем, которому я дал полномочия персонала и администратора, я получаю эту ошибку всякий раз, когда хочу добавить что-то в базе данных:

IntegrityError at /admin/users/user/13/change/ (or whichever action I'm doing)

(1452, 'Cannot add or update a child row: a foreign key constraint fails (`NMS_database`.`django_admin_log`, CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`))')

[...]Exception Location:    /home/me/python_ve/lib/python3.8/site-packages/MySQLdb/connections.py in query, line 239

Это моя модель пользователя:

class User(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", unique=True, max_length=255)
    first_name = models.CharField(max_length=30, blank=True, null=True)
    surname = models.CharField(max_length=30, blank=True, null=True)

    additional = models.BooleanField(default=False)

    individual = models.BooleanField(default=True)
    active = models.BooleanField(default=True) #can they login?
    staff = models.BooleanField(default=False) #staff user non superuser
    admin = models.BooleanField(default=False) #superuser
    date_joined = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'email' # default identifier for that user which will used for logging in

    #email (USERNAME_FIELD in this case) and password are required by default

    REQUIRED_FIELDS = ['first_name', 'surname']

    def __str__(self):
        return "%s %s" % (self.first_name, self.surname)

    def get_full_name(self):
        return self.first_name

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

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin


# hook in the New Manager to our Model
    objects = UserManager()

Как я могу заставить пользователей, которые не являются суперадминами, реально выполнять действия в / admin?

1 Ответ

0 голосов
/ 01 мая 2020

Это было связано с общим замечанием, касающимся пользовательских пользовательских моделей, то есть того, что их нельзя вводить на полпути.

В частности, мои модели использовали таблицу users_user для хранения сведений о новых добавленных пользователях. и таблицу auth_user для добавления внешних ключей, связанных с другими моими моделями в базе данных. Фактически, мой временный обходной путь, заключающийся в вставке копий данных пользователя из таблицы users_user в таблицу auth_user (таким образом, имея дубликат), решил проблему (т.е. не вернул никакой ошибки).

«простое» решение - полностью удалить базу данных и воссоздать ее. Другие решения, которые я нашел (например, this ), не помогли, в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...