102

別のインスタンスでモデルオブジェクトインスタンスを取得しようとしていますが、このエラーが発生します:

 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
4

6 に答える 6

150

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、解決策を提供できます。エラーは常に自明であるとは限りません。

于 2010-10-06T16:07:59.640 に答える
64
topic.__class__.objects.get(id=topic_id)
于 2012-10-16T11:39:15.920 に答える
33

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', ...]
于 2012-04-11T17:40:16.057 に答える
0

トピックが ContentType インスタンス (そうではない) である場合、これは機能します。

topic.model_class().objects.filter(forum = forum)
于 2013-06-09T18:09:26.453 に答える
0

このエラーに似た問題が発生しました。そして、あなたのコードを振り返ってみると、あなたの問題でもあるようです。あなたの問題は、「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()
于 2019-01-19T06:07:11.673 に答える