给定两个具有公共外键的表,如何从Django中的两个连接表中获取所有行?

给定两个具有公共外键的表,如何从Django中的两个连接表中获取所有行?,django,python-2.7,join,Django,Python 2.7,Join,我有两张表,其模型如下所示 class User(models.Model): request = models.ForeignKey(Request) first_name = models.CharField(max_length = 128) middle_name = models.CharField(max_length = 128, null = True, blank = True) last_name = models.Cha

我有两张表,其模型如下所示

class User(models.Model):
    request      = models.ForeignKey(Request)
    first_name   = models.CharField(max_length = 128)
    middle_name  = models.CharField(max_length = 128, null = True, blank = True)
    last_name    = models.CharField(max_length = 128)
    email        = models.EmailField(max_length = 256, null = True)
    phone        = models.CharField(max_length = 32, null = True)

    class Meta:
        db_table = "users"

class Sponsor(models.Model):
        request      = models.ForeignKey(Request)
       sponsor_name   = models.CharField(max_length = 128)
        sponsor_email  = models.CharField(max_length = 128, null = True, blank = True)

       class Meta:
            db_table = "sponsor"
如何实现此sql的等效功能

select users.first_name, users.last_name, sponsor.sponsor_name from users,sponsor where users.request_id = sponsor.request_id;

是否可以在一个django查询中完成,或者我必须先获取所有赞助商,然后获取相关用户?我意识到我可能可以在请求对象本身上使用select_related来完成这项工作,但如果可能的话,我希望避免这样做。

您可以尝试一下,如果这对您有效,请给我一个反馈:

from django.db.models import F

User.objects.annotate(r_id=F('request__id'), s_r_id=F('request__sponsor__request__id'))
            .filter(r_id=F('s_r_id'))

如果您已经通过SQL语句得到了所需的结果,请与此查询得到的结果相匹配。

您是否有指定的请求对象进行筛选?不,我只希望所有发起人都有关联的用户。我认为在一次查询中不可能做到这一点,因为
用户
赞助商
无关。您可以创建一个通过请求外键关联的用户和发起人。我可以通过sql实现这一点,只是不知道如何使用Django。我想你是想要一个组吧?
>>来自Django.db.models import F>>>来自quartermaster.models import User,赞助商>>>User.objects.annotate(r_id=F('request_id'),s_r_id=F('request_赞助商_请求_id'))。filter(r_id=F('s_赞助商_请求_id'))
给出以下错误:
回溯(最近一次调用):文件“/nics/d/home/tsamuel/tssandbox/nics\u venv/lib/python2.6/site packages/django/db/models/manager.py”中第1行的文件“”,第169行的注释返回self.get_queryset()。注释(*args,**kwargs)文件“/nics/d/home/tsamuel/tssandbox/nics\u-venv/lib/python2.6/site-packages/django/db/models/query.py”,注释中的第717行为is\u-summary=False)
文件/nics/d/home/tsamuel/tssandbox/nics\u-venv/lib/python2.6/site-packages/django/db/models/sql/query.py”,第967行为添加聚合字段\u-list=aggregate.lookup.SEP(查找SEP)AttributeError:“F”对象没有属性“lookup”
@tks Django的版本?Django版本:1.6.5
result = Request.objects.filter(user__isnull=False,
                                sponsor__isnull=False) \
                        .values('user__first_name',
                                'user__last_name',
                                'sponsor__sponsor_name')