Как протестировать 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

Так и есть! Проблема в ошибках, которые сопровождают результаты. The resulting integrity errors

Они говорят 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".

Проблема в том, как проверить внешние ключи к самому себе?

Вернуться на верх