【问题标题】:Django - Override manager for specific many-to-many relationship fieldDjango - 特定多对多关系字段的覆盖管理器
【发布时间】:2018-10-02 22:11:43
【问题描述】:

假设我有一个这样的模型:

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

【问题讨论】:

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


    【解决方案1】:

    我将其发布为可能提供帮助的潜在解决方案。

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

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 2010-10-14
      • 2011-07-07
      • 1970-01-01
      • 2014-06-21
      • 2012-06-30
      • 2014-10-20
      • 2016-03-12
      • 2011-08-06
      相关资源
      最近更新 更多