在Django中增加对同值记录的操作。

问题描述 投票:0回答:1

我试图运行查询数据库中相同记录的总和。使用代码而不是文字会更清楚。

class Track(models.Model):
    title = models.CharField()
    isrc = models.CharField()
    ...

class Playlog(models.Model):
    track = models.ForeignKey(Track, on_delete=models.CASCADE)
    ....

在数据库中,有多个记录有相同的 isrc 值。为了得到真正的播放记录数据,我需要得到总的播放记录数,它具有相同的所有Track的isrc。我尝试了下面的查询,但它显示了一个重复的值。Track如果有相同的 isrc 我想得到相同的所有播放记录的总和。isrc 记录。

Playlog.objects.values("track__isrc").annotate(Count("track__playlog", filter=Q(track__playlog__duration__gte=10)) 
django django-models django-orm
1个回答
0
投票

你应该添加一个 .order_by('track__isrc') 以迫使其 "折腰"。你也应该算在模型上,而不是算在相关模型上。

Playlog.objects.values('track__isrc').annotate(
    Count('pk', filter=Q(duration__gte=10)
).orer_by('track__isrc')

也就是说,如果相同的值 isrc 意味着是同一产品等。最好是做一个模型和一个 ForeignKey 到该产品,例如。

class Product(models.Model):
    isrc = mode.sCharField(max_length=128, unique=True)
    # …

class Track(models.Model):
    title = models.CharField(max_length=128)
    isrc = models.ForeignKey(Product, on_delete=models.CASCADE)
    # …

class Playlog(models.Model):
    track = models.ForeignKey(Track, on_delete=models.CASCADE)
    duration = models.IntegerField()
    # …

然后你就可以在产品上标注 Product比如说:

from django.db.models import Count, Q

Product.objects.annotate(
    total_play=Count('track__playlog', filter=Q(track__playlog__duration__gte=10))
)
© www.soinside.com 2019 - 2024. All rights reserved.