使用django ORM进行高级选择

时间:2015-05-05 12:40:55

标签: django database django-models many-to-many models

我使用的是以下型号:

<div class="colors">
  <div class="clip" id="color1">
    <div class="section" id="color1Actual"></div>
  </div>
  <div class="clip" id="color2">
    <div class="section" id="color2Actual"></div>
  </div>
  <div class="clip" id="color3">
    <div class="section" id="color3Actual"></div>
  </div>
</div>

现在我只想要素食菜单的元素,用西红柿过滤

class Topping(models.Model):
    name = models.CharField(max_length=30)

class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

    def __str__(self):              # __unicode__ on Python 2
        return "%s (%s)" % (self.name, ", ".join(topping.name
                                                 for topping in self.toppings.all()))

我的选择是:

pizza_item = Pizza.objects.filter(toppings__name='tomatoes')

但我想得到:

SELECT `pizza`.`id`, `pizza`.`name` 
FROM `pizza` 
INNER JOIN `pizza_toppings` ON ( 
    `pizza`.`id` = `pizza_toppings`.`pizza_id` ) 
INNER JOIN `web_topping` ON ( 
    `pizza_toppings`.`topping_id` = `topping`.`id` )
WHERE `topping`.`name` = azucar

这最后一个查询在mysql db中运行正常。并使用pizza.objects.raw工作,但我想使用django ORM 使用SELECT `pizza`.`id`, `pizza`.`name`, `topping`.`name` FROM `pizza` INNER JOIN `pizza_toppings` ON ( `pizza`.`id` = `pizza_toppings`.`pizza_id` ) INNER JOIN `web_topping` ON ( `pizza_toppings`.`topping_id` = `topping`.`id` ) WHERE `topping`.`name` = azucar 进行选择时,我会使用topping.name进行尝试。但我不能得到相同的选择。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用values方法进行Queryset?

类似的东西:

pizza_item = Pizza.objects.filter(toppings__name='tomatoes').values("id", "name", "toppings__name")

答案 1 :(得分:0)

我不确定这是否可行。因为当您使用 Pizza.objects ... 时,您只能使用Pizza模型中的字段。由于Pizza模型不包含浇头的名称字段。你无法检索它。您只能检索配料的ID字段:

pizza_item = Pizza.objects.filter(toppings__name='tomatoes').values('id', 'name', 'toppings')

这将在SELECT中提供“toppings”。“topping_id”。

此外,由于您已指定 toppings__name ='tomatoes ,因此所有浇头的名称都是此查询集中的西红柿,因此 topping的重点是什么。您的结果中有name