django-denormを使用してマルチレベルの関係を非正規化することは可能ですか?
具体的には、次の構造を持っています。
Question --> User --> CustomProfile --> Avatar
Question
モデルのアバター名を非正規化したい。現時点では、これらの 4 つのテーブルをトラバースして、その情報を取得する必要があります。
Postgresql を使用しています。
django-denormを使用してマルチレベルの関係を非正規化することは可能ですか?
具体的には、次の構造を持っています。
Question --> User --> CustomProfile --> Avatar
Question
モデルのアバター名を非正規化したい。現時点では、これらの 4 つのテーブルをトラバースして、その情報を取得する必要があります。
Postgresql を使用しています。
通常、依存関係の連鎖は機能し、この状況を処理する方法です。
チェーン内の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のウェルカムパッチになります。
これを試したことはありませんが、試してみることができます:
モデル全体で、公式ドキュメントのコードに依存する関連モデルをカスケードします。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 を個人的に使用する可能性があります。