12

メソッドをオーバーライドするモデルがありますsave。これにより、saveメソッドを一部のデータに渡し、保存する前にフィールドに自動入力できます。これが私のモデルです:

class AccountModel(models.Model):

    account = models.ForeignKey(Account)

    def save(self, request=None, *args, **kwargs):
        if request:
            self.account = request.session['account']
        super(AccountModel, self).save(*args, **kwargs)

    class Meta:
        abstract = True

アイデアは、アカウントに関連付ける必要のあるオブジェクトの基本モデルを設定することです。そうすれば、アカウントの接続が発生するたびに処理する必要がなくなります(これは多くのことです)。

get_or_createただし、リクエストを渡さずに新しいオブジェクトを保存する、も使用したいと思います。使用せずget_or_createtry/を実行することは可能ですが、オーバーライドする方法があるかどうか、およびそれを実行する適切な方法は何かexceptを知りたいです。get_or_create

Manager(オーバーライドを検討している)のコードを調べたところ、get_or_create関数は関数を呼び出すだけQuerySet.get_or_createです。QuerySetたぶん、バージョンではなく、他のマネージャー関数を使用するように書くことができますget_or_createか?みんなどう思いますか?

4

1 に答える 1

17

そこでメソッドをサブクラス化django.db.models.query.QuerySetしてオーバーライドし、キーワード引数get_or_createを受け入れてそれを渡すことができると思いますが、あまりきれいではありません。requestsave

class AccountQuerySet(models.query.QuerySet):
    def get_or_create(...):
        ...

次に、このカスタムを使用するカスタムマネージャーをAccountモデルに追加できQuerySetます。

class AccountManager(models.Manager):
    def get_queryset(self):
        return AccountQuerySet(self.model)

次に、モデルでこのマネージャーを使用します。

class Account(models.Model):
    ...
    objects = AccountManager()

try-exceptしかし、結局のところ、この方法の方が優れていることに気付くかもしれません:)

于 2011-03-03T00:40:29.130 に答える