使用django ORM进行高级选择

使用django ORM进行高级选择,django,database,django-models,many-to-many,models,Django,Database,Django Models,Many To Many,Models,我使用以下模型: 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__

我使用以下模型:

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
但我想得到:

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
最后一个查询在mysql数据库中运行良好。使用pizza.objects.raw工作,但我想使用django ORM 是一个带有
topping.name的select。我使用
prefetch\u select('toppings')
尝试它。但是我不能得到同样的选择

您是否尝试过使用Queryset的方法

比如:

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

我不确定这是否可行。因为当您使用Pizza.objects…时,您仅限于Pizza模型中的字段。因为比萨饼模型不包含浇头的名称字段。您无法检索它。您只能检索浇头的id字段:

pizza_item = Pizza.objects.filter(toppings__name='tomatoes').values('id', 'name', 'toppings')
它将在选择中提供“浇头”。“浇头id”


另外,由于您指定了toppings\uuu name='tomatos,因此此查询集中所有toppings的名称都将是西红柿,因此在结果中使用
topping
name
有什么意义呢?

您能详细描述一下您的解决方案吗?这很好,但不返回查询集,仅返回值。但是sql代码是完美的。pizza\u item=[{'toppings\uuu name':u'tomatos',id':1L,'name':u'pizztomato'}]如果我使用toppings\uu name=不是问题,但如果我尝试使用toppings\uu icontains='to'我想要得到所有查询。并希望使用queryset和“聚合”topping.name来获取queryset。如果我使用valuesqueryset,则需要将所有内容添加到查询中,并且将来无法轻松更改模型。但是谢谢你的帮助!!好吧,我现在明白你的意思了。您必须使用预取_相关从另一个模型获取值。Pizza.objects.whatever()将无法获取另一个模型的名称字段。