将 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
中提到
我想获得平均投票的所有专辑。
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
中提到