1

「都市」と「期間」の入力 (両方のリスト) を受け取り、パッケージの「評価」で並べ替えられた上位 30 件の「パッケージ」の結果を返す検索機能をアプリに持っています。

すべてのパラメーターが列であれば実装は簡単ですが、「期間」と「評価」は計算されたプロパティです。これは、標準の Django クエリを使用してパッケージをフィルター処理できないことを意味します。ここで使用する必要があるのは Django の「余分な」メソッドのようですが、私の SQL は良くなく、これはかなり複雑なクエリのようです。

ここで使用する必要がある追加の方法はありますか?もしそうなら、その声明はどのように見えるでしょうか?

該当するコードを以下にコピーします。

#models.py
class City(models.Model):
    ...
    city = models.CharField(max_length = 100)

class Package(models.Model):
    ....
    city = models.ManyToManyField(City, through = 'PackageCity')

    @property
    def duration(self):
        duration = len(Itinerary.objects.filter(package = self))
        return duration

    @property
    def rating(self):
        #do something to get the rating
        return unicode(rating)


class PackageCity(models.Model):
    package = models.ForeignKey(Package)
    city = models.ForeignKey(City)


class Itinerary(models.Model):
    # An Itinerary object is a day in a package, so len(Itinerary) works for the duration
    ...
    package = models.ForeignKey(Package)




#functions.py
def get_packages(city, duration):
    cities = City.objects.filter(city = city) # works fine
    duration_list = range(int(duration_array[0], 10), int(duration_array[1], 10) + 1) # works fine

    #What I want to do, but can't because duration & rating are calculated properties
    packages = Package.objects.filter(city__in = cities, duration__in = duration_array).order_by('rating')[:30]
4

1 に答える 1

3

まず、クエリセットでlen()を使用せず、count()を使用します。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated

次に、評価プロパティを使用して平均評価を計算するようなことをしていると仮定すると、注釈を使用できます: https ://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate

次に、次のようなことを行うことができます。

queryset = Package.objects.annotate({'duration': Count('related-name-for-itinerary', distinct=True), 'rating': Avg('packagereview__rating')})

ここで、「PackageReview」は、ForeignKey to Packageを持ち、「rating」フィールドを持つ、私が作成したばかりの偽のモデルです。

次に、 https://docs.djangoproject.com/en/dev/topics/db/aggregation/#filtering-on-annotationsで説明されているように、注釈付きクエリセットをフィルタリングでき ます (注釈->フィルター間の句の順序の違いに注意してください、およびフィルター->注釈。

プロパティは実行時に計算されるため、フィルタリングなどに実際に使用することはできません。

于 2013-01-21T17:31:42.750 に答える