在Django中加入一个OneToOne字段

时间:2010-05-21 17:41:44

标签: django django-models

我有2个表,simpleDB_all和simpleDB_some。 “all”表有我想要的每个项目的条目,而“some”表只有一些需要附加信息的项目的条目。这些的Django模型是:

class all(models.Model):
    name = models.CharField(max_length=40)
    important_info = models.CharField(max_length=40)

class some(models.Model):
    all_key = models.OneToOneField(all)
    extra_info = models.CharField(max_length=40)

我想创建一个视图,如果“some”中存在额外信息,则显示“all”中的每个项目。由于我使用的是1-1字段,我可以通过几乎完全成功完成此操作:

allitems = all.objects.all()
for item in allitems:
    print item.name, item.important_info, item.some.extra_info

但是当我到达“some”表中没有相应条目的项目时,我得到了一个DoesNotExist异常。

理想情况下,我会在模板中执行此循环,因此无法将其包装在“try”子句中。有什么想法吗?

我可以使用如下查询直接在SQL中获得所需的效果:

SELECT all.name, all.important_info, some.extra_info
    FROM all LEFT JOIN some ON all.id = some.all_key_id;

但我宁愿不使用原始SQL。

1 个答案:

答案 0 :(得分:2)

您不会在模板中获得DoesNotExist例外 - 它们在设计上被模板系统隐藏。

您提供的SQL,或多或少,当您在查询中使用select_related时(如果您从2月开始使用Django 1.2或比r12307更新的结帐时):

allitems = all.objects.select_related('some')