Я пытаюсь получить экземпляр объекта модели в другом и вызываю эту ошибку:
Manager isn't accessible via topic instance
Вот моя модель:
class forum(models.Model):
# Some attributs
class topic(models.Model):
# Some attributs
class post(models.Model):
# Some attributs
def delete(self):
forum = self.topic.forum
super(post, self).delete()
forum.topic_count = topic.objects.filter(forum = forum).count()
Вот мой взгляд:
def test(request, post_id):
post = topic.objects.get(id = int(topic_id))
post.delete()
И я получаю:
post.delete()
forum.topic_count = topic.objects.filter(forum = forum).count()
Manager isn't accessible via topic instances
источник
topic
похоже, это реальный класс модели, а не экземпляр в соответствии с предоставленным им кодом.Manager isn't accessible via Foo instances
возможна только при попытке доступаManager
к экземпляру с использованием экземпляра. См. Исходный код: code.djangoproject.com/svn/django/trunk/django/db/models/…topic
в качестве локальной переменной экземпляра и удаляет ссылку на класс.topic.model_class().objects
topic.__class__.objects
. Казалось бы,model_class()
упомянутое выше @Nimo не работаетtopic.__class__.objects.get(id=topic_id)
источник
__class__
лучше работает для методов в абстрактных моделях, поскольку мы не знаем фактического имени класса-потомка. В этой ситуации я использовалself.__class__.objects.get
Для django <1.10
topic._default_manager.get(id=topic_id)
Хотя не стоит так использовать. _Default_manager и _base_manager являются частными, поэтому рекомендуется использовать их только в том случае, если вы находитесь внутри модели Тема, например, когда вы хотите использовать Manager в проприетарной функции, скажем:
class Topic(Model): . . . def related(self) "Returns the topics with similar starting names" return self._default_manager.filter(name__startswith=self.name) topic.related() #topic 'Milan wins' is related to: # ['Milan wins','Milan wins championship', 'Milan wins by one goal', ...]
источник
topic.__class__.objects.get(id=topic_id)
.self.__class__.objects
не менее, трюк с вашим другим ответом.Также может быть вызвано слишком большим количеством скобок, например
ModelClass().objects.filter(...)
вместо правильного
ModelClass.objects.filter(...)
У меня иногда случается, когда bpython (или IDE) автоматически добавляет скобки.
Результат, конечно же, тот же - у вас есть экземпляр вместо класса.
источник
если бы тема была экземпляром ContentType (а это не так), это сработало бы:
topic.model_class().objects.filter(forum = forum)
источник
model_class()
это методContentType
модели. Другие экземпляры модели, в том числеtopic
, не имеютmodel_class
метода.У меня просто возникла проблема, похожая на эту ошибку. И, оглядываясь на ваш код, кажется, что это тоже может быть ваша проблема. Я думаю, ваша проблема в том, что вы сравниваете "id" с "int (topic_id)" и topic_id не установлено.
def test(request, post_id): post = topic.objects.get(id = int(topic_id)) post.delete()
Я предполагаю, что ваш код должен использовать "post_id", а не "topic_id"
def test(request, post_id): post = topic.objects.get(id = int(post_id)) post.delete()
источник