Sql 理解Django中的完全连接

Sql 理解Django中的完全连接,sql,django,django-models,django-queryset,Sql,Django,Django Models,Django Queryset,我的应用程序中有两种型号: # 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.ManyToMa

我的应用程序中有两种型号:

# 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_的文章,但当我使用它时,它总是说 与选择相关的“xxxx”中给出的字段名无效。选项为:(无)

我错过了什么

编辑

我根据@Fnechz的答案解决了这个问题,我提出了两个问题,然后在元素上循环,这样我就可以将用户_分数添加到旋律中:

# 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)})

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

我不知道是否有一种直接的方法可以通过单个查询实现您想要的。但是我想连接queryset结果可能会有用

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))

如果我理解了你的问题,这可能会起作用

通常你会通过查询投票类来访问“user_score”。您能否澄清您是如何查询“用户分数”字段的?谢谢您的评论。我想得到一个带有单个查询的“表”(如果可能),其中包含用户筛选的Melody类的所有列,如果该用户在投票类中有任何寄存器(已投票支持Melody),则另加一列“user_score”Hi@Fnechz,非常感谢您的回答,所以我按照你的建议,通过查询旋律和投票来解决这个问题,但随后我循环了元素。我还想问一个问题,看看是否有更好的方法,创建一种完全连接查询。。。我将在问题中添加一个编辑,显示我是如何解决它的,这样我的问题就更清楚了。当然,但Django不支持通常意义上的完全联接(内部联接或外部联接),在缺少组合的情况下,您可以尝试通过定义一个无元组来模拟它。无论如何,请尝试查看此链接,您可能会获得一些见解: