我想做的事情最好用例子来描述。请考虑以下事项:
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的记录(对于那些存在此类字段的表)答案 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)