我正在使用Django 1.7。我有一个默认的自定义管理器,可以对“活动”布尔字段进行过滤。根据文档,它必须是与相关字段一起使用的默认管理器(即访问User.story_set仅显示活动的Story对象)。我保留用于管理员和外壳程序访问的标准管理器,但是我无法保存对对象的更改,我推测是因为save()方法在某些时候会通过默认管理器。
class Story(models.Model):
active = models.BooleanField(default=True)
....
objects = ActiveStoryManager()
full_set = models.Manager()
class ActiveStoryManager(models.Manager):
def get_query_set(self):
return super(ActiveStoryManager, self).get_query_set().filter(active=True)
use_for_related_fields = True
这非常适合所有面向公众的使用。但是,在admin和shell中,我无法影响不活动的对象,包括将它们恢复为活动状态。
story = Story.full_set.get(id=#)
将通过获取一个故事active=False
,但是设置后active=True
我无法保存,得到一个
django.db.utils.IntegrityError: duplicate key value violates unique constraint "stories_story_pkey" DETAIL: Key (id)=(#) already exists.
调用save.(force_update=True)
返回django.db.utils.DatabaseError: Forced update did not affect any rows.
因此,尽管save()是一种模型方法,但它似乎在保存过程中的某些时候依赖于默认管理器。
一种解决方法是使用Queryset API(例如)Story.full_set.filter(id=#).update(active=True)
,但这仅在Shell中可用,并且需要手动键入每个更改,但仍无法在管理员中保存非活动实例。
有什么帮助吗?
无法做到!正如inancsevinc指出的那样,save()在默认管理器上调用。在Django文档提到get_query_set不应默认经理进行修改,我也伤心地找到了原因。希望将来可以指定/控制relatedManager,但目前此方法不适用于我。在Django IRC聊天中确认。
相反,我将普通的Manager方法以及某些模型的模型方法放在一起以获得等效的功能。还需要更改related_set
模板中的所有调用以包括新方法,所以这很麻烦,但没有其他方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句