Добавить операцию для записи с таким же значением в Django - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь выполнить запрос суммы той же записи, что и в базе данных. Более понятно использовать коды вместо слов.

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

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

В базе данных есть несколько записей, которые имеют одинаковое значение isrc. Чтобы получить реальные данные плейлога, мне нужно было получить общее количество плейлогов, которое имеет тот же isr c всех треков. Я попробовал выполнить следующий запрос, но он показывает повторяющиеся значения Track. если есть такой же isrc, я хотел бы получить сумму всего плейлога той же isrc записи.

Playlog.objects.values("track__isrc").annotate(Count("track__playlog", filter=Q(track__playlog__duration__gte=10)) 

1 Ответ

0 голосов
/ 25 мая 2020

Вы должны добавить .order_by('track__isrc'), чтобы заставить его «сворачиваться». Вы также должны рассчитывать на модель, а не на связанную модель:

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

При этом, если такое же значение isrc означает, что это тот же продукт, et c. Лучше сделать модель и ForeignKey для этого продукта, например:

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

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

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

Затем вы можете аннотировать Product, например:

from django.db.models import Count, Q

Product.objects.annotate(
    <b>total_play=Count('track__playlog', filter=Q(track__playlog__duration__gte=10))</b>
)
...