4

TrueUser.objects.filter/getに設定された User オブジェクトのみを返す呼び出しの方法が必要です。is_active

次のように、カスタム Manager を定義して、それを User モデルにモンキー パッチしようとしました。

class CustomUserManager(UserManager):

    def get_query_set(self):
        return super(CustomUserManager, self).get_query_set().
          filter(is_active=True)

User.objects = CustomUserManager()
User.objects_all = UserManager()

しかし、User.objects.get() を呼び出そうとすると、次のようになります。
AttributeError: 'NoneType' object has no attribute '_meta'

先に進む前に、このようなモンキー パッチは保守性の点で非常に悪い形式であることを知っていると言いたいと思います。

誰かがそれを望むなら、ここに完全なスタックトレースがあります:

  File "<console>", line 1, in <module>
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 358, in get
    clone = self.filter(*args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 621, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/query.py", line 639, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1250, in add_q
    can_reuse=used_aliases, force_having=force_having)
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1114, in add_filter
    opts = self.get_meta()
  File "/Users/zarathustra/Virtual_Envs/fierce-spring-7383/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 233, in get_meta
    return self.model._meta
AttributeError: 'NoneType' object has no attribute '_meta'
4

2 に答える 2

1

User モデルにフィルタを適用する必要がありますか? 代わりに、このモデルをサブクラス化し、このモデルのマネージャーをコーディングしてみませんか?

class CustomUserManager(UserManager):

    def get_query_set(self):
        return super(CustomUserManager, self).get_query_set().
          filter(is_active=True)


class MyUser(User):
    objects = CustomUserManager()

# get an active user which username is 'foo'
MyUser.objects.get(username='foo')

またはプロキシモデルを使用する

于 2013-01-03T00:02:12.653 に答える
0

この投稿で答えを見つけました。彼の質問は具体的で、私の質問は一般的であるため、重複しているとは見なしませんが、彼の質問に対する回答は私の回答でもあります。

于 2013-01-02T23:26:40.093 に答える