使用Django ORM连接两个表之间的记录

时间:2013-10-24 16:57:58

标签: django python-2.7 join record

我对django在(2)或更多表之间加入记录的能力略显不熟悉。

例如,我有两个表: img

在普通的旧SQL中,我会在id字段

上进行内连接

我在django的 model.py 中设置了此关系:

class Tld(models.Model):
    domainNm = models.CharField(verbose_name="",max_length=40,unique=True,validators=[RegexValidator('^[a-zA-Z0-9]+\.[a-zA-Z]{1,4}$','format: domain.com only','Invalid Entry')])
    FKtoClient = models.ForeignKey(User) 

User表是默认的django表(在最初运行python manage.py syncdb时创建)

如何在django 1.5中的字段DomainNm上加入这两个表?

对不起这里的新手。

谢谢。

1 个答案:

答案 0 :(得分:3)

正如我们在评论中所讨论的那样,您真正想要的是与当前登录用户关联的所有Tld对象的QuerySet。幸运的是,Django使这一点变得相当简单,因为它为您填充了当前User对象的request.user对象,并在Tld和User模型之间创建了RelatedManager(如user.tld_set.all()所示)。

<强> views.py

from django.shortcuts import render

def index(request):
    if request.user.is_anonymous():
        tld_set = []
    else:
        tld_set = request.user.tld_set.all()
    context = {'tld_set': tld_set}
    return render(request, 'index.html', context)

<强>的index.html

<ul>
  {% for tld in tld_set %}
    <li>{{ tld }}</li>
  {% endfor %}
</ul>

由此生成的SQL根本不包含任何JOIN,因为Django已经抓住了User对象(以及它的关联id),用于在调用视图之前填充request.user

SELECT "rcr_tld"."id", "rcr_tld"."FktoClient_id", "rcr_tld"."domainNm"
FROM "rcr_tld"
WHERE "rcr_tld"."FktoClient_id" = 1  --Django already knows the User's id from request.user.id