私は名前と年齢を持つ非常に基本的なユーザモデルがあるとします。Django:N + 1要求なしでクエリーセットの各要素にカスタム属性を追加する方法は?
class User(models.Model):
name = CharField() # e.g. John Smith
age = IntegerField() # e.g. 21
私は、ユーザー18+ Y/Oをフィルタリングすると、それらのそれぞれが"John Smith"
のために、例えば(特別な属性namesakes
を追加するためにそれ["John Williams", "John for Neumann", ...]
のようなものです)。
for user in User.objects.filter(age__gt=18):
user.namesakes = User.objects.filter(name__startswith=user.name.split()).\
all()
をしかし、どのように私は1つっぽいのリクエストでこれを行うのです:私が知っている
、どのようにN + 1つのリクエストでこれを行うには?理想的には、クエリーセット内の各User
オブジェクトに対して、名前付きクエリーセットを含むカスタム属性namesakes
を作成したいと考えています。これはannotate()またはprefetch_related() with to_attrの場合と非常によく似ていますが、正確ではありません。
可能であれば、生のSQLを使用しないことをお勧めします。
ありがとうございます。
私が見ることができる最も近いのは[自分のF式を行うことに関するこの回答](https://stackoverflow.com/a/28821724/1081569)でした。 SQL関数と組み合わせて、[Postgres 'substring(string from pattern)'や 'split_part'](https://www.postgresql.org/docs/9.6/static/functions-string)のように文字列を分割することができます。 html)、おそらくあなたはそれを行うことができます。これはデータベース固有のものかもしれませんが、避けたい(生のSQLはありません)が、Djangoの文字列を分割する機能は見ていません。 –
@PauloAlmeidaありがとう、パウロ、私はそれがまさに私が必要と思うものだと思う。 –