Django:在字段中获得唯一字段并计算它们在表中出现的次数

时间:2018-05-02 07:52:05

标签: django django-queryset

我正在尝试创建一个旅行监控应用程序,而每次旅行都会获得一张票,特定的出发地和目的地。我现在要做的是,给定一个日期范围,我想知道为唯一的始发地 - 目的地对进行了多少次旅行。

我还没有找到解决方案,我希望有人能在这方面给我启发。

这是我的模特:

class Location(models.Model)
    name = models.Charfield(max_length=50, unique=True)
    ...

class Trip(models.Model):
    ticket = models.PositiveIntegerField(primary_key=True, blank=False, null=False)
    origin = models.ForeignKey(Location, on_delete=models.CASCADE)
    destination = models.ForeignKey(Location, on_delete=models.CASCADE)
    ...

我期待以下输出,我目前不知道该怎么做:

Origin   | Destination | Number of Trips
Place #1 | Place #2    | 5
Place #2 | Place #1    | 3
Place #3 | Place #1    | 8
Place #3 | Place #2    | 1

2 个答案:

答案 0 :(得分:0)

尝试:

query = Trip.objects.values('origin', 'destination').annotate(count=Count('pk'))
for trip in query:
    print(trip['origin'], trip['destination'], trip['count'])

如果您想获取位置的名称而不是ID:

query = Trip.objects.values('origin__name', 'destination__name').annotate(count=Count('pk'))
for trip in query:
    print(trip['origin__name'], trip['destination__name'], trip['count'])

这在Django文档中称为aggregation,您可以在那里找到更多示例: https://docs.djangoproject.com/en/2.0/topics/db/aggregation/

答案 1 :(得分:0)

让我发表评论的答案......

Trip.objects.values('origin', 'destination').distinct().annotate(trips=Count('origin'))