Django queryset在select statemens中包含更多列

2024-10-02 12:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用queryset创建一个向后关系,连接工作正常,接受它没有在选定的列中包括另一个连接的表。下面是我的模型,查询集和查询

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

我的问题是

^{pr2}$

这就是我的查询结果

'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 )'

有谁可以帮助显示列表和列表18n中的列?我尝试了额外的,但它不允许我传递类别列表之类的东西。*

谢谢

更新

多亏了丹尼尔的方法,我设法让它发挥作用,但我不得不从列表18n开始

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\u 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吗?我应该在where子句中使用extra和include the tables和do关系吗?或者有更好的方法吗?在


Tags: selfidtrueismainmodelslanguagelist
2条回答

从Main到List的关系是一个向后的ForeignKey(即FK在List上指向Main),而select_related不是这样工作的。仔细想想,这是正确的:每个Main都有很多列表,所以说“给我这个Main的一个列表”是没有意义的,而这正是select_related的全部内容。在

如果您从列表开始,它将起作用:

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

因为那样的话,你只会关注未来的关系。您可能会发现,您可以重新排列视图/模板,以便以这种方式使用查询。在

在我看来,它实际上在工作(在select语句中是T5)。您总是可以通过类似于my_obj.parent.is_active的方式从django中的相关实例访问字段。如果在第一个查询中包含它们之前使用了select_related。如果您没有在select_related中指定它,例如对my_obj.parent.is_active的调用将执行额外的db查询。在

相关问题 更多 >

    热门问题