将 SQLite 翻译成 Django

Translate SQLite to Django

我想获得平均投票的所有专辑。

SELECT a.*, avg(v._mark) AS voting from musicwebapp_album AS a LEFT JOIN musicwebapp_vote AS v ON v.album_id = a.id GROUP BY a.id;

我真的不知道如何用 django 来做。

这是我的模型:

from django.db import models
from django.contrib.auth.models import User

class Artist(models.Model):
    name = models.CharField(max_length=128)

class Genre(models.Model):
    name = models.CharField(max_length=32, unique=True)

class Album(models.Model):
    name = models.CharField(max_length=64)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE, null=False, default=None)
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE, null=False, default=None)
    lend_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True)
    cover = models.CharField(max_length=256, null=True, default=None)

class Vote(models.Model):
    _mark = models.PositiveSmallIntegerField()
    voted_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    album = models.ForeignKey(Album, on_delete=models.CASCADE, null=False)

    def setMark(self, mark):
        if mark <= 0:
            return -1

        if mark > 5:
            return -1

        self._mark = mark
        return sef._mark

    def getMark(self):
        return self._mark

我正在使用 django 2.1.2 和 python 3.6.6.

感谢您的帮助

考虑到你的模型 Vote 有一个专辑的外键(我想你错过了)作为专辑:

class Vote(models.Model):
    _mark = models.PositiveSmallIntegerField()
    voted_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    album = models.ForeignKey(Album, on_delete=models.CASCADE)

你可以这样写:

qs = Album.objects.annotate(voting=Avg('vote___mark'))

这将为您提供专辑的所有属性和投票模型的 _mark 字段的平均值。

现在查询集的每个相册对象都会有投票属性,可以实现为:

for obj in qs:
    average_vote = obj.voting

docs.

中提到