2012-01-13 3 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

Try:

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

EDIT

К сожалению. Непонятно, что вы хотели. Вы должны быть в состоянии просто сделать:

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

Я пробовал это, он работает :), как я уже отмечал в своем вопросе, мне интересно узнать, есть ли способ получить ключ из таблицы «Дети» без присоединения к родительской таблице. – akonsu

+0

@akonsu: см. Править –

2

Там хороший ярлык для этого, который получает только родительские идентификаторы и слизней так является более эффективным:

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

Прохладное использование значений_list и dict! Так или иначе, я не думаю, что когда-либо использовал values_list как мгновенную карту значений ключа. –

Смежные вопросы