1. ホーム
  2. django

[解決済み] モデルインスタンスからマネージャにアクセスできない

2022-12-06 04:56:44

質問

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

 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

どのように解決するのですか?

問題のエラーは、(1) のように 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.

何が問題になっているのか? objectsManager はインスタンスではなく、クラスレベルで利用可能です。を参照してください。 のドキュメントを参照してください。 を参照してください。お金の見積もり

Managers はアクセス可能です だけ は、モデルインスタンスからではなく、モデルクラスを通して、テーブルレベルの操作とレコードレベルの操作の間に分離を強制します。

(強調)

更新

以下の @Daniel のコメントを参照してください。クラス名にタイトルケースを使用するのは良いアイデアです (いや、使わなければなりません :P)。たとえば Topic の代わりに topic . クラス名は、インスタンスを指しているのか、クラスを指しているのか、混乱させます。そのため Manager isn't accessible via <model> instances は非常に特殊であるため、私は解決策を提供することができます.エラーは常にそれほど自明ではないかもしれません。