0

私はこの問題で立ち往生しています:

私は2つのモデルを持っています:

ロケーションとレート。

各ロケーションにはそれぞれのレートがあり、場合によっては複数のレートがあります。

料金の昇順で場所を取得したい。

明らかに、一緒order_byに働かないでdistinct()ください:

locations = Location.objects.filter(**s_kwargs).order_by('locations_rate__rate').distinct('id')

それから私はドキュメントを読み、に来ましたannotate()。しかし、注釈の間に関数を使用する必要があるかどうかはわかりません。

私がこれを行う場合:

locations = Location.objects.filter(**s_kwargs).annotate(rate=Count('locations_rate__rate')).order_by('rate')

ただし、これはレートと注文を合計でカウントします。それらの料金の値で並べ替えられた料金で場所を取得したい。

私のモデル定義は次のとおりです。

class Location(models.Model):
  name = models.TextField()
  adres = models.TextField()

class Rate(models.Model):
  location = models.ForeignKey(Location,related_name='locations_rate')
  rate = models.IntegerField(max_length=2)
  price_rate = models.IntegerField(max_length=2) #<--- added now
  datum = models.DateTimeField(auto_now_add=True,blank=True) #<--- added now
4

4 に答える 4

1

問題は、あなたが説明した問題に対して Django でクエリを作成する方法ではありません。あなたの問題が間違っているか、よく考えられていないということです。例を挙げて説明しましょう:

と の 2 つのLocationオブジェクトがあるl1としl2ます。それに関連するl12 つのRateオブジェクトがあります。そして、それに関連する 1 つのレート オブジェクトを持っています。クエリの結果の後に?? のレートの1 つがのレートよりも低く、もう 1 つのレートが のレートよりも大きいためです。r1r3r1.rate = 1r3.rate = 3l2r2r2.rate = 2l1l2l2l1l1l2l2

于 2013-08-10T09:47:00.293 に答える
1

これを試して:

from django.db.models import Count, Sum
# if you want to annotate by count of rates
locations = Location.objects.filter(**s_kwargs) \
    .annotate(rate_count = Count('locations_rate')) \
    .order_by('rate_count')

# if you want to annotate on values of rate e.g. Sum
locations = Location.objects.filter(**s_kwargs) \
    .annotate(rate_count = Sum('locations_rate')) \
    .order_by('rate_count')
于 2013-08-10T08:05:00.240 に答える
1

annotate(*args, **kwargs),QuerySet 内のオブジェクトに関連するオブジェクトに対して計算された集計値 (平均、合計など) の提供されたリストを使用して、QuerySet 内の各オブジェクトに注釈を付けます。

したがって、レートで並べ替えられた場所のみを取得したい場合は、昇順で annotate() を使用する必要はありません

     you can try this :

     loc = Location.objects.all()
     rate = Rate.objects.filter(loc=rate__location).order_by('-rate')
于 2013-08-10T09:04:09.213 に答える