告诉django不要跟随外键?
Posted
技术标签:
【中文标题】告诉django不要跟随外键?【英文标题】:tell django not to follow foreign key? 【发布时间】:2011-08-02 06:22:26 【问题描述】:有没有办法告诉 django 在实例化模型实例时不要遵循外键关系?模型本身要放什么东西?传递给查询集的东西?我想要一个只返回带有外键 id 的实例的查询集——我不希望这些实例继续查询以找到它的亲戚。类似于select_related
的反义词?
【问题讨论】:
【参考方案1】: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
【讨论】:
我无法在任何地方找到此文档,但似乎“等到访问外键关系”行为仅在外键关系与同一应用程序中的模型存在时才成立。如果外键链接到其应用程序之外的模型,django 将在模型实例化后立即选择。我错了吗?这似乎很糟糕。编辑:使用 debugsqlshell 查看一些测试用例。 是的,你错了,相关模型在哪个应用程序中并不重要,默认情况下,在访问相关属性之前不会检索相关实例的信息。 好的——你是对的。我正在使用 django-debug-toolbar 来观察执行的 SQL。看起来 ddt 中有一个错误导致我上面描述的行为(如果它在当前模型的应用程序之外,它遵循外键关系)。我关闭了 ddt,现在一切都很好。【参考方案2】:试试defer
【讨论】:
defer 不起作用(如果我的问题不是由错误引起的......见下文),因为我想要外键的 id,我只是不想要外键对象本身。以上是关于告诉django不要跟随外键?的主要内容,如果未能解决你的问题,请参考以下文章