набор запросов django включает больше столбцов в операторе выбора - PullRequest
0 голосов
/ 05 мая 2011

Я пытался создать обратную связь, используя набор запросов, и объединение работает нормально, примите, что оно не включает другую объединенную таблицу в выбранных столбцах.Ниже приведены мои модели, набор запросов и запрос. str () print

class Main(models.Model):
    slug       = models.SlugField()
    is_active  = models.BooleanField(default=True)
    site       = models.ForeignKey(Site)
    parent     = models.ForeignKey('self', blank=True, null=True, limit_choices_to={'parent' : None})
    class Meta:
        unique_together = (("slug", "parent"))
    def __unicode__(self):
        return self.slug

class MainI18n(models.Model):
    main                = models.ForeignKey(Main)
    language            = models.CharField(max_length=2, choices=settings.LANGUAGES)
    title               = models.CharField(max_length=100)
    label               = models.CharField(max_length=200, blank=True, null=True)
    description         = models.TextField(blank=True, null=True)
    disclaimer          = models.TextField(blank=True, null=True)
    class Meta:
        unique_together = (("language", "main"))
    def __unicode__(self):
        return self.title
class List(models.Model):
    main        = models.ForeignKey(Main)
    slug        = models.SlugField(unique=True)
    is_active   = models.BooleanField(default=True)
    parent      = models.ForeignKey('self', blank=True, null=True)

    def __unicode__(self):
        return self.slug
class ListI18n(models.Model):
    list        = models.ForeignKey(List)
    language    = models.CharField(max_length=2, choices=settings.LANGUAGES)
    title       = models.CharField(max_length=50)
    description = models.TextField()
    class Meta:
        unique_together = (("language", "list"))
    def __unicode__(self):
        return self.title

и мой набор запросов

Main.objects.select_related('main', 'parent').filter(list__is_active=True, maini18n__language='en', list__listi18n__language='en')

, и это то, что печатает мой запрос

'SELECT `category_main`.`id`, `category_main`.`slug`, `category_main`.`is_active`, `category_main`.`site_id`, `category_main`.`parent_id`, T5.`id`, T5.`slug`, T5.`is_active`, T5.`site_id`, T5.`parent_id` FROM `category_main` INNER JOIN `category_maini18n` ON (`category_main`.`id` = `category_maini18n`.`main_id`) INNER JOIN `category_list` ON (`category_main`.`id` = `category_list`.`main_id`) INNER JOIN `category_listi18n` ON (`category_list`.`id` = `category_listi18n`.`list_id`) LEFT OUTER JOIN `category_main` T5 ON (`category_main`.`parent_id` = T5.`id`) WHERE (`category_maini18n`.`language` = en  AND `category_list`.`is_active` = True  AND `category_listi18n`.`language` = en )'

Кто-нибудь может помочь показать столбцы из списка и listi18n?Я пробовал дополнительно, но он не позволяет мне передавать такие вещи, как category_list. *

спасибо

ОБНОВЛЕНИЕ

Спасибо за подход Дэниела, мне удалосьчтобы заставить его работать, но вместо этого мне пришлось начать с ListI18n

ListI18n.objects.select_related('list', 'list__main', 'list__main__parent', 'list__main__i18nmain').filter(list__is_active=True, list__main__maini18n__language='en', language='en').query.__str__()

Теперь он работает отлично, но я не могу включить list_ main _maini18n, ниже выводится запрос

'SELECT `category_listi18n`.`id`, `category_listi18n`.`list_id`, `category_listi18n`.`language`, `category_listi18n`.`title`, `category_listi18n`.`description`, `category_list`.`id`, `category_list`.`main_id`, `category_list`.`slug`, `category_list`.`is_active`, `category_list`.`parent_id`, `category_main`.`id`, `category_main`.`slug`, `category_main`.`is_active`, `category_main`.`site_id`, `category_main`.`parent_id`, T5.`id`, T5.`slug`, T5.`is_active`, T5.`site_id`, T5.`parent_id` FROM `category_listi18n` INNER JOIN `category_list` ON (`category_listi18n`.`list_id` = `category_list`.`id`) INNER JOIN `category_main` ON (`category_list`.`main_id` = `category_main`.`id`) INNER JOIN `category_maini18n` ON (`category_main`.`id` = `category_maini18n`.`main_id`) LEFT OUTER JOIN `category_main` T5 ON (`category_main`.`parent_id` = T5.`id`) WHERE (`category_list`.`is_active` = True  AND `category_listi18n`.`language` = en  AND `category_maini18n`.`language` = en )'

Есть идеи, как включить MainI18n в результат запроса?я должен использовать дополнительные и включить таблицы и сделать отношения в предложении, где?или есть лучший подход?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Отношение между Main и List является обратным ForeignKey (то есть FK в List указывает на Main), и select_related не работает таким образом. Когда вы думаете об этом, это правильно: существует много списков для каждого основного, поэтому не имеет смысла говорить «дайте мне один список для этого основного», что и составляет select_related.

Если вы начали с List, это сработало бы:

List.objects.select_related('main__parent').filter(is_active=True, main__maini18n__language='en', listi18n__language='en')

потому что таким образом вы только следите за отношениями форвардов. Может оказаться, что вы можете изменить порядок своих представлений / шаблонов, чтобы использовать запрос таким образом.

0 голосов
/ 05 мая 2011

Мне кажется, это действительно работает (T5 в вашем утверждении select). Вы всегда можете получить доступ к полям из связанных экземпляров в django через что-то вроде my_obj.parent.is_active. Если вы использовали select_related, прежде чем они будут включены в первый запрос. Если вы не укажете это в select_related, например, вызов my_obj.parent.is_active выполнит дополнительный запрос БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...