说我有这样的模型:
class Appointment(models.Model):
services = models.ManyToManyField(
'models.Service', through='common.AppointmentService')
我想要做的是覆盖该字段以返回一个特定的查询集(类似于下面的东西,它不会工作):
class Appointment(models.Model):
services = models.ManyToManyField(
'models.Service', through='common.AppointmentService')
@property
def services(self)
return super(Appointment, self).services.all_with_deleted()
我正在实施软删除。
我软删除服务模型,通过设置deleted_at
字段从应用程序中删除任何“已删除”服务。但是对于已经存在该服务的约会,我需要尊重这些服务而不是“删除”它们。因此,在我使用appointment.services
的任何地方,我都需要致电appointment.services.all_with_deleted()
。但是我不希望在我的代码中散落。模型应该通过自定义管理器或覆盖的字段抽象出这些细节。
答案 0 :(得分:0)
我发布这个作为可能有用的潜在解决方案。
class Appointment(models.Model):
services = models.ManyToManyField(
'models.Service', through='common.AppointmentService')
# alias this field so we can override it on each instance as a property
_services = services
@property
def services(self):
'''appointments should ignore soft deleted team member services'''
return self._services.all_with_deleted()
@services.setter
def services(self, srvs):
self._services.set(srvs)
我的困惑来自于不区分属性和属性。没有为python类的属性定义getter和setter,但@property
确实在类的每个实例上定义了__get__
和__set__
方法。
这打破了查询。您现在需要编写如下查询:
Appointment.objects.filter(_services__in=[1,2,3])