29

Model タイプの関連リストを取得するために、Django のデフォルトの User モデルに新しい関数を追加したいと考えています。

そのようなFooモデル:

class Foo(models.Model):
    owner = models.ForeignKey(User, related_name="owner")
    likes = models.ForeignKey(User, related_name="likes")

.........

    #at some view
    user = request.user
    foos= user.get_related_foo_models()

これはどのように達成できますか?

4

3 に答える 3

45

にメソッドを追加できます。User

from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)

このコードが、django の起動時にインポートされる models.py またはその他のファイル内にあることを確認してください。

于 2010-05-31T13:06:58.610 に答える
14

これは、@Lakshman Prasad の回答の更新です。しかし、完全な例:

::monkey_patching.pyのいずれかにファイルを作成しますapps

#app/monkey_patching.py
from django.contrib.auth.models import User 

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)

__init__.pyアプリのファイルにインポートします。すなわち::

#app/__init__.py
import monkey_patching
于 2014-07-10T03:53:03.860 に答える
4

ドキュメントに記載されているように、ユーザーモデルを置き換えることは珍しいことではありません: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model、したがって、これを持つこれを考慮して、次のコードでユーザー モデル クラスを取得することをお勧めします。

from django.contrib.auth import get_user_model
UserModel = get_user_model()

その後、UserModel@Lakshman Prasad が提案するように、これを使用して機能を追加できますUserModel.add_to_class('get_related_foo_models', get_related_foo_models)


コードを 1 回だけ実行するために、Django アプリケーション構成クラス ( https://docs.djangoproject.com/es/1.9/ref/applications/ ) を使用することを好むため、完全な動作例は次のようになります。

# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'

# myapp/apps.py
from django.apps import AppConfig
from django.contrib.auth import get_user_model


class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = 'MyApp'

    def ready(self):
        # Add some functions to user model:
        def custom_function(self):
            # Do whatsoever
            pass

        UserModel = get_user_model()
        UserModel.add_to_class('custom_function', custom_function)
于 2016-02-08T14:09:22.500 に答える