我想弄清楚一个棘手的Django查询,我希望你能帮上忙。我有这样的模式:如何返回表格中最受欢迎的物品,但每个物品的唯一位置?
class ActiveVenue(models.Model):
event = models.ForeignKey(Event)
venue = models.ForeignKey(Venue)
class Venue(models.Model):
name = models.CharField(max_length=200)
class Event(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=200)
在我的应用程序有很多活动和每个事件可以有多个活动场地,因此我目前的数据结构。如果您的解决方案不是“将您的模型更改为foo”,而是已经部署的网站,我希望保留当前的模型结构。
我想编写一个查询,返回最受欢迎的场地,但每个用户只会计算一次场地。例如,如果我有一个用户有四个活动,并且他们每次都使用相同的场地,我只想在确定最受欢迎的场地时统计一次场地。
为了说明这一点,想象这是我的数据:
event: A user: bob venue: The Hill
event: B user: bob venue: The Hill
event: C user: bob venue: The Hill
event: D user: jane venue: The Oaks
event: E user: sarah venue: The Pound
event: F user: david venue: The Pound
event: G user: ron venue: The Oaks
event: H user: erica venue: The Oaks
这里流行的顺序将是:
1. The Oaks
2. The Pound
3. The Hill
任何建议我如何编写一个查询来做到这一点,双方的Postgres工作和sqlite(换句话说,不依赖于distinct()
(在sqlite中不支持))?
谢谢!
我很确定'Disctinct'应该在sqlite中工作。按照https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct,你不能在sqlite中指定参数,但该函数应该可以工作。 – miki725 2013-03-26 05:33:47
考虑到用户限制,我不认为你可以使用Django ORM来做到这一点。为此,您似乎必须编写一些手动SQL。 – miki725 2013-03-26 05:35:27
@ miki725我同意,如果它被抽象为一个返回集合的函数,它可以在支持distinct()的情况下推迟到ORM,否则手动SQL。 – 2013-03-26 22:15:55