【问题标题】:Add operation on same valued record in Django在 Django 中对相同值的记录添加操作
【发布时间】:2020-05-25 11:29:46
【问题描述】:

我正在尝试查询数据库上相同记录的总和。用代码代替文字更清楚。

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

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

在数据库中有多个具有相同isrc 值的记录。要获得真正的播放日志数据,我需要获得所有曲目的相同 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】:

    你应该添加一个.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))
    )

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多