Я использую Джанго 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
Это хорошо работает для любого публичного использования. Однако в админке и шелле я не могу воздействовать на неактивные объекты, в том числе возвращать их в активное состояние.
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() является модельным методом, похоже, что в какой-то момент процесса сохранения он зависит от менеджера по умолчанию.
Обходной путь использует API Queryset, например. Story.full_set.filter(id=#).update(active=True)
, но это можно использовать только в оболочке и требует ручного ввода каждого изменения, по-прежнему нельзя сохранять неактивные экземпляры в админке.
Любая помощь в этом?
if
вget_query_set
, чтобы метод сохранения всегда выполнялся независимо? Я просто хочу использовать фильтр для всех запросов на чтение. - person sybaritic   schedule 23.11.2014