다른 인스턴스에서 모델 개체 인스턴스를 얻으려고하는데이 오류가 발생합니다.
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
답변
문제의 오류 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
A는 Manager
이 아닌 경우에, 클래스 레벨에서 사용할 수 있습니다. 자세한 내용은 개체 검색에 대한 설명서를 참조 하십시오. 돈 견적 :
Managers
“테이블 수준”작업과 “레코드 수준”작업을 분리하기 위해 모델 인스턴스가 아닌 모델 클래스를 통해서만 액세스 할 수 있습니다.
(강조 추가)
최신 정보
아래 @Daniel의 의견을 참조하십시오. 클래스 이름에 대한 제목 대소 문자를 사용하는 것이 좋습니다 (아니요, 반드시 : P해야합니다). 예를 들어 Topic
대신 topic
. 클래스 이름은 인스턴스 또는 클래스를 참조하는지에 따라 약간의 혼란을 야기합니다. Manager isn't accessible via <model> instances
매우 구체적 이기 때문에 해결책을 제시 할 수 있습니다. 오류가 항상 자명하지 않을 수도 있습니다.
답변
topic.__class__.objects.get(id=topic_id)
답변
장고 <1.10의 경우
topic._default_manager.get(id=topic_id)
이렇게 사용하면 안되지만. _default_manager 및 _base_manager는 비공개이므로 독점 기능에서 Manager를 사용하려는 경우와 같이 Topic 모델 내부에있는 경우에만 사용하는 것이 좋습니다.
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', ...]
답변
한 쌍의 괄호로 인해 발생할 수도 있습니다.
ModelClass().objects.filter(...)
올바른 대신
ModelClass.objects.filter(...)
bpython (또는 IDE)이 자동으로 괄호를 추가 할 때 가끔 발생합니다.
물론 결과는 동일합니다. 클래스 대신 인스턴스가 있습니다.
답변
topic이 ContentType 인스턴스 (아닌 경우)이면 작동했을 것입니다.
topic.model_class().objects.filter(forum = forum)
답변
이 오류와 비슷한 문제가 발생했습니다. 그리고 당신의 코드를 되돌아 보면 그것이 당신의 문제 일 수도있는 것 같습니다. 귀하의 문제는 “id”를 “int (topic_id)”와 비교하고 topic_id가 설정되지 않은 것입니다.
def test(request, post_id):
post = topic.objects.get(id = int(topic_id))
post.delete()
코드가 “topic_id”가 아닌 “post_id”를 사용해야한다고 생각합니다.
def test(request, post_id):
post = topic.objects.get(id = int(post_id))
post.delete()