Ограничение исключения Django Postgres с ManyToManyField
Я хотел бы использовать ограничение исключения Django с ManyToManyField. К сожалению, пока мои усилия были тщетными. Это моя модель назначения:
из django.contrib.postgres.constraints импорт ExclusionConstraint из django.contrib.postgres.fields импорт DateTimeRangeField, RangeOperators
class Appointment:
patients = models.ManyToManyField(Patient, related_name='appointments' , blank=True )
datetimerange = DateTimeRangeField(null=False, blank = False )
doctor = models.ForeignKey(Doctor, related_name='doctor_appointments')
class Meta:
constraints = [
ExclusionConstraint(
name='unique_doctor',
expressions=[
('datetimerange', RangeOperators.OVERLAPS),
('doctor ', RangeOperators.EQUAL),
],
),
ExclusionConstraint(
name='unique_patients',
expressions=[
('datetimerange', RangeOperators.OVERLAPS),
('patients', RangeOperators.CONTAINED_BY)
],
condition= Q(is_archived=False) & Q(is_cancelled=False)
)
]
К сожалению, это не работает. Первое ограничение, которое ссылается на Доктора, работает отлично, но второе дает мне эту ошибку во время миграции:
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column "patient_id" named in key does not exist
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column "patient_id" named in key does not exist
Это уже довольно давно меня утомляет. Любая помощь приветствуется.
1 ответ
Проблема здесь в том, что ограничение должно быть сделано наAppointment
стол модели, однако, потому чтоpatients
является полем M2M, столбца нет, как говорится в сообщении об ошибке. Связь основана на промежуточной таблице, которая содержит внешний ключ.
В результате вы не можете делать именно то, что хотите здесь.
Однако вы можете встроить эту проверку в модель.clean()
метод.