Django - 在覆盖其行为时调用自定义更新行为

时间:2017-01-18 09:28:04

标签: django django-queryset

我想做的事情最好用例子来描述。请考虑以下事项:

class QuerySetManager(models.Manager):
    def get_queryset(self):
        result = self.model.QuerySet(self.model)
        try:
            result = result.filter(is_deleted=False)
        except FieldError:
            pass
        return result

class MyModel(model.Models):
    # core fields
    objects = QuerySetManager()
    class Meta:
        managed = False
        db_table = 'my_model'

    class QuerySet(QuerySet):
        def update(self, *args, **kwargs):
           if something_special:
              # handle that special case
           else:
              # call custom update

实际上,我试图覆盖QuerySet的超类的更新方法。如果出现特殊情况,我想自己实现更新过程,否则 - 调用超类的标准更新方法。 有关正确语法的任何帮助吗?

更新 让我提供一些详细的背景。 我正在使用找到的模式here。 整个架构看起来像这样:

class DeleteMixin(models.Model):
    is_deleted = models.BooleanField(default=False)

    class Meta:
        abstract = True

class QuerySetManager(models.Manager):
    def get_queryset(self):
        result = self.model.QuerySet(self.model)
        try:
            result = result.filter(is_deleted=False)
        except FieldError:
            pass
        return result

class Sms(DeleteMixin):
   # core fields 
   objects = QuerySetManager()

   class Meta:
       managed = False
       db_table = 'sms'
   class QuerySet(QuerySet):
       def inbox(self, user):
           return self.filter(sms_type_id = 1)

       def outbox(self, user):
           return self.filter(sms_type_id = 2)
       def update(self, *args, **kwargs):
           if something_special:
              # handle that special case
           else:
              # the issue in question - call custom update

这种架构使我能够:

  • 排除is_deleted字段等于1的记录(对于那些存在此类字段的表)
  • 使用可链接的过滤器,如sms.objects.inbox()。outbox()

2 个答案:

答案 0 :(得分:1)

并不是很清楚你在问什么。如果您尝试将自定义更新方法添加到Queryset的超类更新方法,如下所示:

class MyQuerySet(QuerySet):
    def update(self, *args, **kwargs):
           ....

         super(MyQuerySet,self).update(*args,**kwargs)

如果您尝试覆盖模型中的save方法

class MyModel(model.Models):
    def save(self,*args,**kwargs):
        ...
        super(MyModel,self).save(*args,**kwargs)

更新(双关语)

我上面发布的代码示例是正确的。 QuerySet类肯定是一种更新方法。从这里可以看出:

https://github.com/django/django/blob/master/django/db/models/query.py#L630

如果你有正确的子类QuerySet,你将不会得到错误。但你还没有

class QuerySet(QuerySet):

这是不正确的。

答案 1 :(得分:-1)

最终,我以这种方式工作:

def update(self, *args, **kwargs):
    if something_special:
        # handle that special case
    else:
        super(self.model.QuerySet, self).update(*args,**kwargs)