У меня две модели (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, но тогда это не будет понятно на уровне кода.