2

忙着玩 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 和 shell 中尝试了select_related,但它似乎不起作用。请参阅下面的示例。

在 url 中配置

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

在贝壳

>>> 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'

所以基本上,

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

2 回答 2

4

像这样的东西应该工作:

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

如果要遵循外键,则必须明确执行。当您从 Table1 检索对象时,您不会获得自动联接。当您访问外键字段(本例中为用户)时,您只会从 Table2 中获取一个对象

于 2009-08-05T09:49:30.600 回答
2

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

a.user.username

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

如果您有select_relatedSQL 将在您对a. 但是如果你没有,select_related那么它只会在你实际执行时加载 DB a.user.username

于 2009-08-05T09:50:13.530 回答