Djangoのクエリセット?から最新の値をクエリセットの注釈参加フィルタ私は、単一の式では、<em>多対1の関係</em><em>への注釈</em>の<em>フィルタ</em>結果から<em>最新</em>値を取得できますか
このおもちゃスキーマを考える:
- 派生
foo_status
とbar_status
それぞれ:(Lorem
モデル用)ジャンゴLoremAdmin
でカスタムクエリセットを作るためにfrom django.db import models class Lorem(models.Model): """ Lorem ipsum, dolor sit amet. """ class LoremStatusEvent(models.Model): """ A status event change on a given `ipsum` for a `lorem`. """ created = models.DateTimeField(auto_now_add=True) lorem = models.ForeignKey(Lorem) ipsum = models.CharField(max_length=200) status = models.CharField(max_length=10)
、私がする必要があります個別のJOIN句から
LoremStatusEvent
モデルへ:lorem.loremstatusevent_set__status
。 - 各参加をフィルタリングすると、対応する
Ipsum
値のイベントのみが含まれます。foo_status_events=LoremStatusEvent.filter(ipsum='foo')
。 - ステータスイベントのセットを、対応する各参加の最新のものに集約します(
foo_status=LoremStatusEvent.objects.filter(ipsum='foo').latest('created').status
)。 - 2つの追加値、
foo_status
とbar_status
:queryset = queryset.annotate(foo_status=???).annotate(bar_status=???)
で結果に注釈を付けます。
私はこのすべてを行うには、いくつかの機能を考案した場合 - get_field
、latest_by
、filter_by
、loremstatus_set_of_every_corresponding_lorem
を - 私は、管理者を書くことができ、このような何か:
from django.contrib import admin
class LoremAdmin(admin.ModelAdmin):
""" Django admin for `Lorem` model. """
class Meta:
model = Lorem
def get_queryset(request):
""" Get the `QuerySet` of all instances available to this admin. """
queryset = super().get_queryset(request)
queryset.annotate(
foo_status=(
get_field('status')(
latest_by('created')(
filter_by(ipsum='foo')(
loremstatusevent_set_of_every_corresponding_lorem)))),
bar_status=(
get_field('status')(
latest_by('created')(
filter_by(ipsum='bar')(
loremstatusevent_set_of_every_corresponding_lorem)))),
)
return queryset
これらのプレースホルダ名のそれぞれを置き換える必要があり、実際どのような機能?
loremstatus_set_of_every_corresponding_lorem
は、Lorem.loremstatusevent_set
に相当します。filter_by
右側の結合をフィルタリングする。latest_by
、結果セットをフィールド順に集約して、単一の最新インスタンスを取得する。私はそのようなdocumented aggregation functionが表示されません。get_field
、結果インスタンスからフィールドを参照する。
Lorem.loremstatusevent_set
を介して関連するインスタンスにアクセスすることは、すべてLorem
のクエリセットで行う必要があります。私はその時点でLoremStatusEvent
インスタンスを持っていないので、私はLoremStatusEvent
の属性を直接使用することはできません。
実際のDjangoの機能は上記のプレースホルダに含まれていますか?
も参照してください:https://stackoverflow.com/questions/31234880/annotate-with-value-of-latest-related-in-django-1-8-using-conditional-annotation – Risadinha