Django - 遵循外键关系(即SQL中的JOIN)

时间:2009-08-05 09:40:02

标签: python django django-models django-urls

忙着玩django,但有一件事似乎是绊倒我跟随外键关系。现在,我在编写SQL方面有很多经验,所以我可能会遇到问题。如果ORM不存在则返回结果。

基本上这是我要返回的SQL查询

Select
  table1.id
  table1.text
  table1.user
  table2.user_name
  table2.url
from table1, table2
where table1.user_id = table2.id

我的模型类已被定义为:

class Table1(models.Model):
    #other fields
    text        = models.TextField()
    user        = models.ForeignKey('table2')

class Table2(models.Model):
    # other fields
    user_name = models.CharField(max_length=50)
    url = models.URLField(blank=True, null=True)

我已经浏览了django网站上的查询集,模型和视图的文档和参考。但它仍然不清楚如何做到这一点。

我还使用通用列表视图设置了url,但是想要从模板中的第二个表访问 user_name 字段。我在urls.py中尝试了 select_related ,也通过shell尝试了但它似乎不起作用。见下面的例子。

在网址中配置

url(r'^$','django.views.generic.list_detail.object_list', { 'queryset': Table1.objects.select_related() }),

在shell

>>> a = Table1.objects.select_related().get(id=1)
>>> a.id
1
>>> a.user_name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Table1' object has no attribute 'user_name'

基本上,

  • 我做错了什么?
  • 我错过了什么吗?
  • 将同一查询集中两个表的字段传递给模板的最佳方法是什么(因此可以访问两个表中的字段)
  • 可以使用通用视图完成吗?

2 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

u = Table1.objects.get(id=1)
print u.id
print u.user.user_name

如果要关注外键,则必须明确执行。从Table1检索对象时,您不会获得自动连接。当您访问外键字段时,您将只从Table2获取对象,该字段是本示例中的用户

答案 1 :(得分:2)

select_related()不要直接将第二个表结果添加到查询中,它只是“加载”它们,懒得给你懒散。只有当您确定它可以提高您的网站性能时,您才应该使用它。要获得第二个表,您需要编写

a.user.username

在Django中获取相关表格,您需要通过您设计的外键来跟踪它们。查询本身不直接转换为SQL查询,因为它是“懒惰”。它只会在您需要时执行您需要的SQL。

如果您select_related a,那么当您对select_related进行原始查询时,就会执行SQL。但是,如果您没有a.user.username,那么只有在您实际执行{{1}}时才会加载数据库。