Диспетчер недоступен через экземпляры модели
Я пытаюсь получить экземпляр объекта модели в другом. И я поднимаю эту ошибку :
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
5 ответов:
данная ошибка возникает при попытке доступа к
Manager
модели через экземпляр модели. Вы использовали нижний регистр имена классов. Это делает его трудно сказать, если ошибка вызвана экземпляром доступа кManager
или нет. Поскольку другие сценарии, которые могут вызвать эту ошибку, неизвестны, я исхожу из предположения, что вы каким-то образом перепуталиtopic
переменная, так что вы в конечном итоге указывая на экземплярtopic
модель вместо класс.эта строка является виновником:
forum.topic_count = topic.objects.filter(forum = forum).count() # ^^^^^
вы должны использовать:
forum.topic_count = Topic.objects.filter(forum = forum).count() # ^^^^^ # Model, not instance.
что происходит?
objects
этоManager
доступно на уровне класса, а не экземпляров. Смотрите документация для извлечения объектов для сведения. Деньги цитата:
Managers
доступны только через классы моделей, а не из экземпляров модели, чтобы обеспечить разделение между операции "на уровне таблиц" и "на уровне записей".(Курсив)
обновление
смотрите комментарии от @Daniel ниже. Это хорошая идея (нет, вы должны :P) использовать регистр заголовка для имен классов. Например,
Topic
вместоtopic
. Ваши имена классов вызывают некоторую путаницу, ссылаетесь ли вы на экземпляр или класс. Так какManager isn't accessible via <model> instances
очень конкретно я могу предложить решение.Ошибка может быть не такой самоочевидно всегда.
для django
topic._default_manager.get(id=topic_id)
хотя вы не должны использовать его, как это. _default_manager и _base_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', ...]