Skip to main content
 首页 » 编程设计

python之django 反向查询

2024年09月03日41soundcode

我正在尝试从父项到子项进行查询,并且使用单个查询能够使子项在父项中产生结果。在我的示例中,我试图在 i18n 表之间建立关系,我想在其中一次包含子表中的行。

模型.py

class main(models.Model): 
    slug       = models.SlugField() 
    is_active  = models.BooleanField(default=True) 
    site       = models.ForeignKey(Site) 
 
    def __unicode__(self): 
        return self.slug 
 
class main_i18n(models.Model): 
    main        = models.ForeignKey(main) 
    language    = models.CharField(max_length=2, choices=LANGUAGES) 
    title       = models.CharField(max_length=50) 
    class Meta: 
        unique_together = (("language", "main")) 
    def __unicode__(self): 
        return self.title 

我尝试了以下查询

a=main.objects.filter(is_active=True, main_i18n__language='en') 

它完美地完成了关系,这是我在尝试打印查询时看到的

>>> a.query.__str__() 
'SELECT `category_main`.`id`, `category_main`.`slug`, `category_main`.`is_active`, `category_main`.`site_id` FROM `category_main` INNER JOIN `category_main_i18n` ON (`category_main`.`id` = `category_main_i18n`.`main_id`) WHERE (`category_main_i18n`.`language` = en  AND `category_main`.`is_active` = True )' 

正如您从查询中看到的那样,它正确地进行了连接,但列名未包含在 select 语句中。尝试执行 for 循环时无法访问 main_i18n 数据。

抱歉我的英语不好,希望我能找到帮助,

祝愿

---- 编辑:

下面是我目前正在使用的模板,最终我真的很想创建一个查询并根据我的 View 中列出的数据进行重新分组。

    <table class="homepage-listing"> 
        <tr> 
            <td> 
{#                {% regroup list by main as rg_main %}#} 
                {% for obj in main %} 
{#                    {% if obj.grouper != None %}#} 
                    <div class="listing-block"> 
                            <a href="#" ><h3>{{ obj }}</h3></a> 
                            <ul> 
                                {% for s in obj.list %} 
                                    <li>{{ s.list_i18n_set.get }} </li> 
                                {% endfor %} 
                            </ul> 
                    </div> 
{#                    {% endif %}#} 
                {% endfor %} 
            </td> 
        </tr> 
    </table> 

--- 编辑:

为此,我不得不使用额外的函数来构建单个查询。我从它开始,但变得有点复杂,我试图确保查询中没有硬编码的列和连接是正确的。谁能告诉我是否有更好的方法来编写查询?

    dict = Main.objects.extra( 
    select= 
    { 
        'main_title' : '%s.%s' % (MainI18n._meta.db_table, MainI18n._meta.get_field('title').verbose_name), 
        'list_title' : '%s.%s' % (ListI18n._meta.db_table, ListI18n._meta.get_field('title').verbose_name), 
    }, 
    tables=[ 
            '%s' % (MainI18n._meta.db_table), 
            '%s' % (List._meta.db_table), 
            '%s' % (ListI18n._meta.db_table), 
    ], 
    where=[ 
            '%s.%s=%s.%s' % (MainI18n._meta.db_table, 'main_id', Main._meta.db_table, 'id'), 
            '%s.main_id=%s.id' % (List._meta.db_table, Main._meta.db_table), 
            '%s.list_id=%s.id' % (ListI18n._meta.db_table, List._meta.db_table), 
            'category_listi18n.language="%s"' % (request.LANGUAGE_CODE) 
    ]).select_related().filter(maini18n__language=request.LANGUAGE_CODE ) 

请您参考如下方法:

当您使用外键时,您需要通过 RelatedManager 访问该数据。在您的情况下,您将从 main 中访问 main_i18n 中的数据,例如:

>>> a=main.objects.get(id=1) 
>>> i18n = a.main_i18n_set.get() 
>>> i18n.language 
u'en' 

或者如果您需要对多个对象进行操作:

a = main.objects.filter(is_active=True, main_i18n__language='en') 
for obj in a: 
  i18n = obj.main_i18n_set.get() 
  print i18n.language 

这当然会为过滤器返回的每个对象打印“en”。