理解Django中的Full Join



我的应用程序中有两个模型:

# Create your models here.
class Melody(models.Model):
notes = models.JSONField()
bpm = models.IntegerField()
aimodel = models.CharField(max_length=200)
score = models.IntegerField(default=0)
person = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="melodies")
date_created = models.DateTimeField(default=timezone.now)
def __str__(self):
return str(self.id)
class Vote(models.Model):
user_score = models.IntegerField(validators=[MaxValueValidator(1), MinValueValidator(-1)])
melody = models.ForeignKey(Melody, on_delete=models.CASCADE, related_name="scores")
person = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="voters")
def __str__(self):
return f"{self.person} - {self.melody} - {self.score}"

我通过获得当前用户的旋律

# Get melodies of current user
melodies = Melody.objects.all().filter(person=person).order_by('-score')[start:end+1].values()

我想把用户对每个旋律的投票添加到这个结果中,如果有,否则就为空,这样我就可以循环播放旋律并检索值:

melody.notes = ...
melody.bpm = ...
melody.user_score = This is the values I do not know still how to get, Null if user has not voted

我读过select_related,但当我使用它时,它总是说"select_related:'xxxx'中给定的字段名无效。选择是:(无(">

我错过了什么?

编辑

我根据@Fnechz的答案解决了这个问题,方法是进行两个查询,然后在元素上循环,这样我就可以将user_score添加到旋律中:

# Get melodies of current user
melodies = Melody.objects.all().filter(person=person).order_by('-score')[start:end+1].values()
# Get votes of the user
votes = Vote.objects.all().filter(person=person)
for i, m_melody in enumerate(melodies):
for m_vote in votes:
if (m_vote.melody.id == m_melody['id']):
melodies[i]['user_score'] = m_vote.user_score

return  JsonResponse({"melodies": list(melodies)})

不确定这是否是实现的最佳方式

我不知道是否有一种直接的方法可以用一个查询完成您想要的任务。但我想连接查询集结果可能会起作用。

from itertools import chain
melodies = Melody.objects.all().filter(person=person).order_by('-score')[start:end+1].values()
votes = #query your vote model here to get the user_score
result_list = list(chain(melodies,votes))

如果我理解了你的问题,那可能会奏效

最新更新