Django - 覆盖特定多对多关系字段

时间:2018-04-22 22:30:40

标签: django django-models many-to-many django-orm

说我有这样的模型:

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()。但是我不希望在我的代码中散落。模型应该通过自定义管理器或覆盖的字段抽象出这些细节。

1 个答案:

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