django查询器在select语句中包含更多的列 [英] django queryset include more columns in select statement

查看:134
本文介绍了django查询器在select语句中包含更多的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用查询集创建一个向后关系,并且加入正常,接受它不包括所选列中的其他连接表。以下是我的模型,查询和查询。 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')。fil ter(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。*



谢谢



更新



感谢Daniel的做法,我设法让它工作,但我不得不从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 __()

它现在工作完美, t include list_ main _maini18n,下面是输出查询

 'SELECT`category_listi18n`.`id ```category_listi18n`.`list_id`,`category_listi18n``````````` category_listi18n`````````````````````````````````````````````````````````` `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 ```````````_````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````` T5.`id`)WHERE(`category_list`.`is_active` = True AND`category_listi18n`.`language` = en AND`category_maini18n`.`language` = en)'
任何想法如何在查询结果中包含MainI18n?/ pre>

我应该使用extra并包含表,并在where子句中执行关系吗?还是有更好的方法?

解决方案

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

因为那样你只能跟着前进的关系。您可能会发现您可以重新排序您的视图/模板,以便以这种方式使用查询。


I been trying to create a backward relation using queryset and the joining is working fine, accept that its not including the other joined table in the selected columns. Below is my models, queryset and query.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

and my queryset is

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

and this is what my query is printing

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

anyone can help show columns from list and listi18n? I tried extra but It doesn't allow me to pass things like category_list.*

thanks

UPDATE

Thanks for Daniel approach, I managed to get it to work but instead I had to start from 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__()

Its working perfectly now, but I couldn't include list_main_maini18n, below is the output query

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

Any idea how can I include MainI18n in the query result? should I use extra and include the tables and do the relation in the where clause? or is there a better approach?

解决方案

The relationship from Main to List is a backwards ForeignKey (ie the FK is on List pointing at Main), and select_related doesn't work that way. When you think about it, this is correct: there are many Lists for each Main, so it doesn't make sense to say "give me the one List for this Main", which is what select_related is all about.

If you started from List, it would work:

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

because that way you're only following forwards relationships. You may find you're able to reorder your views/templates to use the query this way round.

这篇关于django查询器在select语句中包含更多的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆