【发布时间】:2013-01-21 16:29:00
【问题描述】:
我的应用中有一个搜索功能,它接收“城市”和“持续时间”输入(两个列表)并返回按包“评级”排序的前 30 个匹配“包”结果。
如果所有参数都是列,那么实现起来会很容易,但是“duration”和“rating”是计算属性。这意味着我不能使用标准的 Django 查询来过滤包。 seems that 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]
【问题讨论】:
-
您应该使用 Signals 将评分和持续时间保存在某处,这样会更容易
-
@sacabuche 信号与过滤查询集有什么关系?
-
@patrickn 什么都没有,但最好保存这些数据而不是每次都计算恕我直言