2

モデル インスタンスの開始時にモデル属性を動的に設定する方法について質問があります。

ネイティブの PostgreSQL JSONField を持つ単純なモデルを使用しています。

from django.db import models
from django.contrib.postgres.fields import JSONField

class Booking(models.Model):
    data = JSONField(blank=False, encoder=DjangoJSONEncoder)

モデルがインスタンス化されたときに「データ」フィールドに格納された値に基づいて、モデル インスタンスに属性を設定する方法はありますか?

私はこれを行うことができるようにしたい:

from .models import Booking

b = Booking.objects.create(data={'foo':'bar'})
b.foo # this should yield 'bar'

私の最初の考えは、モデルのinitメソッドをオーバーライドし、setattr() でインスタンス属性を設定することでしたが、モデルの init メソッドをオーバーライドすることは、Django のドキュメントでは強く推奨されていません。

これを達成する他の方法はありますか?どんな助けでも大歓迎です。

PS: モデル インスタンスの「データ」に格納されている値に、booking.data['foo'] のようにアクセスできることはわかっているので、これは探しているものではありません。

4

2 に答える 2

1

__getattr__モデルにフックを実装するだけです。つまり、次のようになります。

class Booking(models.Model):

    # ...
    def __getattr__(self, name):
        try:
            return self.data[name]
        except KeyError:
            try:
                return super(Boooking, self).__getattr__(name)
            except AttributeError: 
                raise AttributeError(
                   "object %s has no attribute '%s'" % (type(self).__name__, name)
                   ) 

しかし、あなたのjsonコンテンツが常に同じ構造を持っていることに本当に自信がない限り、私はそれに対してアドバイスします.プレーンなinstance.data[key]構文を使用する方がより明示的です.

于 2017-05-10T11:06:41.483 に答える