0

django-denormを使用してマルチレベルの関係を非正規化することは可能ですか?

具体的には、次の構造を持っています。

Question --> User --> CustomProfile --> Avatar

Questionモデルのアバター名を非正規化したい。現時点では、これらの 4 つのテーブルをトラバースして、その情報を取得する必要があります。

Postgresql を使用しています。

4

2 に答える 2

2

通常、依存関係の連鎖は機能し、この状況を処理する方法です。

チェーン内の1つのモデルが提供されていない場合、最善のオプションは、 https ://github.com/initcrash/django-denorm/blob/master/にあるものと同様の独自の依存関係クラスを実装することです。 denorm /dependencies.py

だからあなたは得る:

class Question(models.Model):
    @denormalized(...)
    @depend_on_related("User")
    @depend_on_indirectly_related("CustomProfile",through="User")
    def avatar(self):
        return self.user.custom_profile.avatar_name

class CustomProfile(models.Model):
    @denormalized(...)
    @depend_on_related("Avatar")
    def avatar_name(self):
        return self.avatar.name

もちろん、これはdjango-denormのウェルカムパッチになります。

于 2012-08-16T14:36:25.313 に答える
1

これを試したことはありませんが、試してみることができます:

モデル全体で、公式ドキュメントのコードに依存する関連モデルをカスケードします。Avatar --> Custom Profile --> User --> Question

内部でトリガーを使用するため、カスケードする必要があります。

class SomeModel(models.Model):
    # the other fields
    other = models.ForeignKey('SomeOtherModel')

    @denormalized(models.CharField,max_length=100)
    @depend_on_related('SomeOtherModel')
    def some_computation(self):
       # your code
       return some_value

これが機能しない場合は、django の ORM に応じて、カスタム SQL を個人的に使用する可能性があります。

于 2012-08-15T21:34:12.250 に答える