我在django有两个模型:
class Pair(models.Model):
pass
class Person(models.Model):
pair = models.ForeignKey(to=Pair, related_name='mates')
city = models.ForeignKey(to=City)
所以我需要计算不同城市的配对频率:
city_a<->city_b: 100
city_a<->city_a: 80
city_b<->city_c: 200
...
对于每个人,我可以通过以下方式获得对方的城市: person.pair.mates.exclude(id=person.id).first()
或者类似的,所以理论上我可以循环所有 Person
然后再计算频率,但显然这将是超低效的。
但我不知道如何通过标准查询集(如果有办法的话)获得这些信息。任何提示都欢迎
1条答案
按热度按时间xyhw6mcr1#
您可以注解这些对,例如:
这个
__name
应该是你想使用的城市的一个领域。例如__pk
可能也是一个选择。查询的工作方式如下:
Q(pair__mates__lt=F('pk')) | Q(pair__mates__gt=F('pk'))
通常应该排除“配偶”指的是相同的Person
. 然后我们使用.values(..)
去拿name
(或其他文件)从城市和pair__mates__city__names
. 既然我们有了这两个值Count(..)
每组数据的记录数city1
以及city2
. 这个.order_by(..)
是避免订阅的必要条件,比如qs[1]
将从原始记录中返回一条记录Person
查询。因此,查询如下所示:
这将返回一个
QuerySet
词典数量: