Как протестировать foreignkeys to self в django
Django разрешает внешний ключ к "self", как в
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
verbose_name="User",
related_name="user_profiles",
)
entity = models.ForeignKey(
Entity,
on_delete=models.CASCADE,
verbose_name="Entity",
related_name="entity_profiles",
)
email = models.EmailField(
max_length=255,
help_text=_("Automatically generated to use entity email domain"),
)
supervisor0 = models.ForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
verbose_name="Supervisor0",
related_name="supervisor0_profiles",
help_text=_("Employees only."),
)
supervisor1 = models.ForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
verbose_name="Supervisor1",
related_name="supervisor1_profiles",
help_text=_(
"Employees only. Only the executive head is his/her own \
supervisor."
),
)
supervisor2 = models.ForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
verbose_name="Supervisor2",
related_name="supervisor2_profiles",
help_text=_(
"Employees only. Only the executive head is his/her own \
supervisor."
),
)
supervisor3 = models.ForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
verbose_name="Supervisor3",
related_name="supervisor3_profiles",
help_text=_(
"Employees only. Only the executive head is his/her own \
supervisor."
),
)
Супервайзер0 является пользователем и статус супервайзера0 идентифицирует его как сотрудника. Другие супервайзеры также должны быть уже в базе данных, чтобы на них можно было ссылаться.
В справочных_текстах объясняется ситуация исполнительного главы.
Вопрос в том, как проверить эти отношения к "себе". У меня нет проблем с отношениями к другим моделям.
Используя pytest, я записываю только supervisor0 в ProfileFactory на данный момент.
class ProfileFactory(factory.django.DjangoModelFactory): class Meta: model = Profile
user = factory.SubFactory(UserFactory)
entity = factory.SubFactory(EntityFactory)
supervisor0 = user
Должна возникнуть ошибка утверждения, если нет супервизора1:
def test_profile_supervisor0_and_no_supervisor1():
left = "supervisor0" and "supervisor1"
right = "supervisor0" and not "supervisor1"
assert left == right
Так и есть! Проблема в ошибках, которые сопровождают результаты.
Они говорят ERROR internalcontrol/tests/test_models.py::test_profile_str - django.db.utils.IntegrityError: дублирующее значение ключа нарушает уникальное ограничение "users_user_username_key"
ERROR internalcontrol/tests/test_models.py::test_profile_get_absolute_url - django.db.utils.IntegrityError: дублированное значение ключа нарушает уникальное ограничение "users_user_username...
Они ссылаются на предыдущие тесты string и get_absolute_url, которые проходят при отсутствии отношения "self".
Проблема в том, как проверить внешние ключи к самому себе?