gpt4 book ai didi

Django,自定义管理器影响保存方法?

转载 作者:行者123 更新时间:2023-12-04 18:40:40 24 4
gpt4 key购买 nike

我正在使用 Django 1.7。我有一个默认的自定义管理器,可以过滤“事件” bool 字段。根据文档,它需要是处理相关字段的默认管理器(即访问 User.story_set 仅显示事件的 Story 对象)。我保留了管理员和 shell 访问的标准管理器,但我无法保存对对象的更改,我推测是因为 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 docs提到不应在默认管理器上修改 get_query_set,我遗憾地发现了原因。希望将来可以指定/控制相关管理器,但现在这种方法对我不起作用。在 Django IRC 聊天中确认。

相反,我将一个普通的 Manager 方法和一些模型的模型方法放在一起,以获得等效的功能。还需要更改所有related_set在模板中调用以包含新方法,因此很痛苦,但别无他法。

关于Django,自定义管理器影响保存方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com