クエリセット内のオブジェクトにデータを追加する必要がある状況があり、モデルクラスにカスタムメソッドを実装するだけでなく、注釈付きのクエリを実行することが本当に有益な場合を理解するのに苦労しています。
一般的な例として:
この:
MyModel.objects
.filter(
some_field=some_value
)
.annotate(
has_something=Exists(
Something.objects.filter(
whatever=OuterRef('pk'),
start_date__gte=SIX_MONTHS_AGO
)
),
something_else= ... # Some complex query
)
これに対して:
class MyModel(models.Model):
some_field = CharField()
def has_something(self):
return (self.something_set
.filter(start_date__gte=SIX_MONTHS_AGO)
.count() > 0)
def something_else(self):
... # Make some other queries
class Something(models.Model):
whatever = models.ForeignKey(MyModel)
start_date = models.DateField()
したがって、どちらの場合も、必要な場所(テンプレートなど)で次のようなことができます。
{% for obj in my_model_queryset %}
{{ obj.has_something }}
{% endfor %}
私の知る限り、注釈を付ける場合、すべての作業はデータベースエンジンによって行われ、すべてを1回のデータベースヒットで行うことができます(私は思いますか?)。一方、モデルクラスにメソッドを実装する場合、逆引き参照や外部モデルからのデータを取得する必要がある場合は、追加のクエリが実行される可能性があります。
質問したいのですが、あるアプローチを別のアプローチよりも使用する場合について、経験則やガイダンスはありますか?特に注釈が非常に複雑になる場合(たとえば、Qオブジェクト、サブクエリ、GroupConcatなどを使用する場合)
ありがとう。
回答 1 件
関連記事
- DjangoAdminで多対多モデルのすべてのフィールドを表示するにはどうすればよいですか?
- ネストされたmapメソッドをasync/awaitモデルで変換します
- Pythonデータモデル/内部メソッド
- ドメインモデルクラスは常にプリミティブに依存する必要がありますか?
- djangoifステートメントにエラーがあります。何を修正すればよいですか?
- Djangoビューテンプレートはモデルデータを表示できません
- Djangoの画像モデルからホームページに画像を取得するにはどうすればよいですか?
- DjangoのPOSTとGETの両方でモデル属性を使用する方法
- 現在のレコードを上書きせずに、Djangoモデルレコードを事前に入力して保存するにはどうすればよいですか?
関連した質問
- モデルフォームの更新をユーザーに制限する
- DjangoクエリはPythonシェルで機能しますが、テンプレートとフォームでは機能しませんでした
- 入力に基づいて計算されるモデルにプロパティを追加するにはどうすればよいですか?
- Djangoの選択肢ではよりわかりやすい名前を使用してください
- 外部キーを介して接続された別のモデルのフィールドを使用してDjangoフィルターデータ
- ユーザーがどのグループに属しているかを知る方法
- djangotemplateexceptionsTemplateDoesNotExist:/ hello /
- 3つの異なるモデルフォームを備えたDjangoUpdateView
- Djangoモデルフォームベースのシステムをサインアップ用の生のHTMLベースのフォームシステムに変換します
- Djangoで1対1のテーブルフィールド値にアクセスする
ここに例があります:
これにより、すべてに対して1つのクエリが実行されます
Model
+1つのクエリと結合User
それぞれについてmodel
ループ中ただし、1つのクエリでのみ実行できます。
ここでは、1つのクエリのみが実行されます。それが実行することです。
Djangoでは、サブクエリを実行してループを実行することはありません。パフォーマンスに非常に悪影響を及ぼします。
と
F
そしてQ
あなたはかなり複雑なことをすることができます、それが本当に複雑なときに私がしたいことは、複数のクエリに分割して使用することです:それは私の経験則ですが、これが適合しない場合は、Pythonプロセスを実行して
set
またはdict
私が必要なもの(しかし、ここにいることは本当にまれです)