Django-использование нескольких внешних ключей для одной модели

Я пытаюсь использовать один и тот же внешний ключ для двух полей в одной модели и получаю ошибку.

Im пытается иметь первичного и вторичного по вызову пользователя, но не уверен, как отформатировать отношения после получения ошибок ниже

class ManualRotas(models.Model):
    rota_name = models.CharField(max_length=200,choices=settings.ONCALL_ROTAS)
    primary_user = models.ForeignKey(User, unique=True, verbose_name="Primary OnCall Engineer")
    p_start_time = models.DateTimeField(verbose_name="Start Time")
    p_end_time = models.DateTimeField(verbose_name="End Time")
    secondary_user = models.ForeignKey(User, verbose_name="Backup OnCall Engineer", unique=True,blank=True,null=True)
    s_start_time = models.DateTimeField(blank=True,null=True, verbose_name="Start Time")
    s_end_time = models.DateTimeField(blank=True,null=True,verbose_name="Start Time")


ERRORS:
oncall.ManualRotas.primary_user: (fields.E304) Reverse accessor for 'ManualRotas.primary_user' clashes with reverse accessor for 'ManualRotas.secondary_user'.
        HINT: Add or change a related_name argument to the definition for 'ManualRotas.primary_user' or 'ManualRotas.secondary_user'.
oncall.ManualRotas.secondary_user: (fields.E304) Reverse accessor for 'ManualRotas.secondary_user' clashes with reverse accessor for 'ManualRotas.primary_user'.
        HINT: Add or change a related_name argument to the definition for 'ManualRotas.secondary_user' or 'ManualRotas.primary_user'.

WARNINGS:
oncall.ManualRotas.primary_user: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
        HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
oncall.ManualRotas.secondary_user: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
        HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.

System check identified 4 issues (0 silenced).

1 ответ

  1. Вы должны определить различные related_nameдля обоих ForeignKeysстолбцов. Например:

    class ManualRotas(models.Model):
        primary_user = models.ForeignKey(User, related_name='related_primary_manual_roats', unique=True, verbose_name="Primary OnCall Engineer")
        #                            related names ^ v
        secondary_user = models.ForeignKey(User, related_name='related_secondary_manual_roats', verbose_name="Backup OnCall Engineer", unique=True,blank=True,null=True)
        # .... Other columns
    

    См. также ForeignKey.related_nameдокумент, в котором говорится : :

    Имя, используемое для связи от связанного объекта обратно к этому. Это также значение по умолчанию для related_query_name(имя, используемое для обратного имени фильтра из целевой модели). Полное описание и пример см. В документации по связанным объектам. Обратите внимание, что это значение необходимо задать при определении отношений в абстрактных моделях; при этом доступен специальный синтаксис.


    Соответствующие должности: