django反向查询
|
我正在尝试从父级到子级进行查询,并且可以通过单个查询将子级结果放在父级中。在我的示例中,我试图在i18n表之间建立一种关系,在该表中,我想在一次点击中包含子表中的行。
models.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数据。
对不起,我英语差劲,希望我能找到帮助,
最好的祝愿,
----编辑:
下面是当前使用的模板,最终我真的很想创建一个查询并进行重新分组以列出视图中的数据。
<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 )
没有找到相关结果
已邀请:
2 个回复
烷刨画颠离
:
编辑:您可以将其包装在自定义queryset方法中。快速解决方案(不允许您进一步过滤QuerySet)如下所示:
慰泥悍瓶
或者如果您需要对多个对象进行操作:
这当然会为过滤器返回的每个对象打印\'en \'。