1

次のような Django モデルがあります。

class MyModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.IntegerField()
    nonDbField = SomeObject()
    objects = MyCustomManager()

field1 は、実際には SomeObject の抽象クラスへの PK です。

関数 (all、filter、get など) によって返されるすべての値に対して、次の処理を行うカスタム マネージャーが必要です。

 value.nonDbField = SomeObject.objects.get(pk=value.field1)

get を次のように手動でオーバーライドできることをテストしました。

class MyCustomManager(models.Manager):
    def get(self, *args, **kwargs):
        value = super(MyCustomManager, self).get(*args, **kwargs)
        value.nonDbField = SomeObject.objects.get(listid=value.itemListID)
        return value

しかし、すべての関数でそれを行う簡単な方法があるかどうか疑問に思いました.

「どうしてこんなことをしているの?」と言う人も多いでしょう。これは、レガシーであるがまだアクティブなデータベースのモデル継承に関係しています。

4

2 に答える 2

2

nonDbField の値を field1 (またはモデル内の他のフィールド) に関連付ける必要がある場合は、次のように試すことができます。

Class MyModel(models.Model):

    # your fields here...

    def _nonDbField(self):
        return SomeObject.objects.get(pk=self.field1)
    nonDbField = property(_nonDbField)

これにより、次のようなことができます。

MyModel.objects.get(pk=1).nonDbField

アクセスするたびにデータベース クエリを実行していることnonDbFieldに注意してください (DB のパフォーマンスに悪影響を与える場合もあれば、そうでない場合もあります)。

于 2012-06-22T02:49:12.043 に答える