2012-01-04 1 views
4

Скажем, у меня есть простой блог запись модели в Django:Django - Избегание соединений при запросе идентификаторов внешнего ключа?

class Entry(models.Model): 
    author = models.ForeignKey(Author) 
    topic = models.ForeignKey(Topic) 
    entry = models.CharField(max_length=50, default='') 

Теперь сказать, что я хочу, чтобы запросить для автора или темы, но исключить конкретную тему в целом.

entry_list = Entry.objects.filter(Q(author=12)|Q(topic=123)).exclude(topic=666) 

Sinmple достаточно, но я обнаружил, что это сырье SQL содержит объединение по теме таблицы, даже если он не должен быть использован:

SELECT `blog_entry`.`id` 
FROM `blog_entry` 
LEFT OUTER JOIN `blog_topic` 
    ON (`blog_entry`.`topic_id` = `blog_topic`.`id`) 
WHERE ((`blog_entry`.`author_id` = 12 
     OR `blog_entry`.`topic_id` = 123 
     ) 
     AND NOT ((`blog_topic`.`id` = 666 
        AND NOT (`blog_topic`.`id` IS NULL) 
        AND `blog_topic`.`id` IS NOT NULL 
       )) 
    ) 

Почему? Как я могу заставить Django запрашивать только идентификаторы столбцов и не присоединяться к таблицам? Я пробовал следующее, но это дает FieldError:

entry_list = Entry.objects.filter(Q(author_id=12)|Q(topic_id=123)).exclude(topic_id=666) 

ответ

2

Интересно, является ли это ошибкой.

пытается аналогичный пример, я получить не присоединиться, если положить exclude перед filter (но я получить его, используя ваш заказ)

+0

Согласен, я получаю одну и ту же вещь, которую вы, как вы, не есть ли способ, вы можете заставить его просто использовать column_id? – user749618

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