2011-04-09 25 views
1

有没有办法告诉Django在实例化模型实例时不要遵循外键关系?有什么东西可以放在模型本身上?有什么要传递给查询集?我想有一个查询集只返回具有外键id的实例 - 我不希望这些实例停止查询以找到它的亲属。与select_related相反的东西?告诉django不要关注外键?

回答

3

的Django的默认行为是要等到一个外键关系进行数据库查询来填充相关的模型实例之前访问。

为了侧向自动查询相关实例,而不是直接访问ForeignKey字段属性,可以访问attribute_id(例如,

class Person(models.Model): 
    name = models.CharField(max_length=200) 
    user = models.ForeignKey('auth.User') 

# access the user id via user_id 
person = Person.objects.all()[0] 
print person.user_id 
+0

我一直无法找到这个记录,但似乎'等到外部关键字被访问'的行为只有在外键关系与同一个应用程序中的模型一致的情况下才有效。如果外键链接到应用程序之外的模型,django会在模型实例化后立即选择。我错了吗?这看起来很糟糕。编辑:用debugsqlshell查看一些测试用例。 – Bacon 2011-04-09 22:23:48

+0

是的,您错了,相关模型的相关应用程序并不重要,默认情况下,相关实例的信息在获取相关属性之前不会被检索到。 – 2011-04-09 22:27:32

+0

好吧 - 你是对的。我使用django-debug-toolbar来观察执行的SQL。看起来ddt中存在一个导致上述行为的错误(如果它不在当前模型的应用程序中,它会遵循外键关系)。我把ddt关了,现在一切都很好。 – Bacon 2011-04-09 22:58:01

0

尝试defer

+0

延迟将无法工作(有我的问题不是由错误引起的...见下文),因为我想外键的ID,我只是不想外键对象本身。 – Bacon 2011-04-09 23:00:19