「都市」と「期間」の入力 (両方のリスト) を受け取り、パッケージの「評価」で並べ替えられた上位 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]