忙着玩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'
基本上,
答案 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}}时才会加载数据库。