Двунаправленное отношение OneToOne - Django - PullRequest
0 голосов
/ 08 июля 2019

У меня две модели (Slot, Appointment).На первой встрече я определил отношение OneToOne с моделью слота, так что пока все хорошо;благодаря RelatedManager я могу получить доступ к назначению из объекта слота, но это сделано на уровне Python, и мне нужно (для некоторых будущих изменений) столбец appointment_id на таблице Slot.

class Slot(models.Model):
    start_at = models.DateTimeField()
    end_at = models.DateTimeField()
    duration = DateTimeRangeField(
        null=True,
        blank=True
    )
    # Bidirectional 
    appointment = models.OneToOneField(
        "appointments.Appointment",
        on_delete=models.SET_NULL,
        related_name="slot",
        blank=True,
        null=True
    )

class Appointment(models.Model):
    slot = models.OneToOneField(
        Slot,
        on_delete=models.SET_NULL,
        related_name="appointment",
        null=True,
        blank=True,
    )

Приведенный выше код вызовет некоторые ошибки при попытке создания миграций, например:

appointments.Appointment.slot: (fields.E302) Reverse accessor for 'Appointment.slot' clashes with field name 'Slot.appointment'.
    HINT: Rename field 'Slot.appointment', or add/change a related_name argument to the definition for field 'Appointment.slot'.

По сути, из-за Python-части ORM вы не можете определить одно и то же поле в обеих моделях.

Есть идеи, как этого добиться.Думаю, мне придется переписать некоторые части RelatedManager.Я мог бы сделать это сгенерировать SQL, но тогда это не будет понятно на уровне кода.

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