具有ManyToManyField的Django Postgres排除约束

bbuxkriu  于 2022-11-19  发布在  Go
关注(0)|答案(1)|浏览(144)

我想对ManyToManyField使用Django排除约束。不幸的是,到目前为止我的努力都是徒劳的。这是我的约会模型:
从django.contrib. postgres.字段导入日期时间范围字段,范围操作符

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)                
        ) 
        ]

不幸的是,这不起作用。第一个引用Doctor的约束很好地工作,但是第二个在迁移过程中出现了这样的错误:

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

这件事困扰我很久了。任何帮助都很感激。

xzv2uavs

xzv2uavs1#

这里的问题是,必须在Appointment模型的表上进行约束,但是因为patients是M2M字段,所以没有错误消息中所说的列。关系基于保存外键的中间表。
“结果就是你在这里不能做你想做的事"
但是,您可以将此验证构建到模型的clean()方法中。

相关问题