我试图运行查询数据库中相同记录的总和。使用代码而不是文字会更清楚。
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))
你应该添加一个 .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))
)