如何在具有外键的模型上在Django中实现联接查询

问题描述

每个人。我想在Django的Profile模型中实现“以下”功能我有一个关系模型,我想同时加入这两个字段,以便我可以选择匹配查询用户

我知道peewee,我会做类似以下的事情:

def following(self):
    return ( User.select().join(Relationship,on=Relationship.to_user).where(Relationship.from_user == self))

但是我无法找到如何在Django中进行联接查询
这是我在models.py

上使用的模型
class Profile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    joined_at = models.DateTimeField()

    class Meta:
        ordering = ['-joined_at']

    def __str__(self):
        return f'{self.user.username} profile' 

    def following(self):
        """ I want to implement the query here. """

class Relationship(models.Model):
    from_user = ForeignKey(User,related_name='relationships')
    to_user = ForeignKey(User,related_name='related_to')

解决方法

您可以尝试一下;

def following(self):
    """ return list objects of User followings """
    return Relationship.filter(from_user=self.user)\
                       .values_list('to_user',flat=True)

但是,我需要将其作为queryset返回,怎么回事?

def following(self):
    """ this will return as `User` queryset """
    user_ids = Relationship.filter(from_user=self.user)\
                           .values_list('to_user_id',flat=True)
    return User.objects.filter(id__in=user_ids)