2012-01-13 77 views
1

说我有这些模型: 获取外键值而不获取整个对象?

 
class Parent(models.Model): 
    slug = models.SlugField()
class Child(models.Model): slug = models.SlugField() parent = models.ForeignKey('Parent')

我想创建一个dict

 
{x.parent.pk : x.slug for x in Child.objects.all()} 
这个代码生成每个迭代一个单独的数据库查询。只是为了获得 Parent对象,只是为了得到它的主键。这就是在 Child对象那里开始!我不需要父母的任何东西,只需要它的主键。我如何获得底层外键的价值?

(是的,我知道我可以使用select_related()摆脱这些额外的查询,但我的问题是不是这个。)

的感谢!

回答

4

这应该工作

{x.parent_id : x.slug for x in Child.objects.all()} 
1

尝试:

{x.parent.pk : x.slug for x in Child.objects.select_related('parent')} 

编辑

对不起。误解了你想要的东西。你应该能够只是做:

{x.parent_id : x.slug for x in Child.objects.all()} 
+0

我试过了,它的工作原理:),正如我在我的问题中指出的那样,我有兴趣了解是否有一种方法可以在不加入Parent表的情况下从Child表中获取密钥。 – akonsu 2012-01-13 20:14:49

+0

@akonsu:查看编辑 – 2012-01-13 20:20:02

2

有这个一个很好的快捷方式,这只是取父ID和蛞蝓等是更有效的:

dict(Child.objects.values_list('parent_id', 'slug')) 
+0

很酷的使用values_list和dict!不知何故,我不认为我曾经使用values_list作为即时键值映射。 – 2012-01-13 23:07:47