使用 django ORM 进行高级选择

     2023-02-24     137

关键词:

【中文标题】使用 django ORM 进行高级选择【英文标题】:Advanced select with django ORM 【发布时间】:2015-07-15 04:53:18 【问题描述】:

我正在使用以下模型:

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 db 中运行良好。并且使用 Pizza.objects.raw 但我想使用 django ORM 是topping.name 的选择,我尝试使用prefetch_select('toppings')。但我无法获得相同的选择。

【问题讨论】:

【参考方案1】:

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

类似:

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

【讨论】:

您能详细描述一下您的解决方案吗? 这工作正常但不返回查询集,只返回值。但是sql代码是完美的。 Pizza_item = ['toppings__name': u'tomatoes', 'id': 1L, 'name': u'pizztomato']【参考方案2】:

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

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

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

另外,既然你已经指定了 toppings__name='tomatoes,那么在这个查询集中所有的 toppings 的名字都会是西红柿,那么有 topping.@987654323 有什么意义呢? @ 在你的结果中?

【讨论】:

如果我使用 toppings__name= 不是问题,但如果我尝试使用 toppings__icontains='to' 我想获取所有查询。并希望使用查询集和“聚合” topping.name 来获取查询集。如果我使用 valuesqueryset 需要将所有内容添加到查询中,并且将来无法轻松更改模型。但是谢谢你的帮助!! 好的,我明白你的意思了。您必须使用 prefetch_related 从其他模型中获取值。 Pizza.objects.whatever() 不会得到另一个模型的名称字段。

使用 Django ORM 进行查询

】使用DjangoORM进行查询【英文标题】:ToqueryusingDjangoORM【发布时间】:2020-05-2807:13:44【问题描述】:我有下面的SqlQuery,它会拉出过期的测试。cursor.execute(\'\'\'selectauth_user.username,auth_user.email,tests_test.title,tests_seller.company_name,tests_t... 查看详情

如何使用 django orm 进行嵌套 Group By?

】如何使用djangoorm进行嵌套GroupBy?【英文标题】:HowtodonestedGroupBywithdjangoorm?【发布时间】:2021-11-2502:25:02【问题描述】:我有以下数据:publishertitle-------------------------------------------------------------NewAgeBooksLifeWithoutFearNewAgeBooksLi 查看详情

如何使用 django ORM 在 postgres 中仅选择日期部分

】如何使用djangoORM在postgres中仅选择日期部分【英文标题】:HowtoselectonlydatepartinpostgresbyusingdjangoORM【发布时间】:2017-05-1014:20:08【问题描述】:我的后端设置如下Postgres9.5Python2.7Django1.9我有一个日期时间类型的表,名为createdAt。... 查看详情

如何计算多个字段并使用 django orm 对它们进行分组

】如何计算多个字段并使用djangoorm对它们进行分组【英文标题】:Howtocountmorethanonefieldsandgroupingthemusingdjangoorm【发布时间】:2017-12-1110:03:17【问题描述】:我是Django及其ORM的新手。表User有很多用户。我需要对活跃用户和总数进行... 查看详情

使用 Django ORM 进行快速移动平均计算

】使用DjangoORM进行快速移动平均计算【英文标题】:FastmovingaveragecomputationwithDjangoORM【发布时间】:2018-07-2505:04:10【问题描述】:我们运行Postgres9.6.5和Django2.0。我们有一个Model字段created_at和value。我们需要计算某个date_range的90天... 查看详情

Django ORM 使用过滤器进行注释

】DjangoORM使用过滤器进行注释【英文标题】:DjangoORMannotatewithfilter【发布时间】:2015-12-0810:11:07【问题描述】:我需要获取特定组中用户的帖子或评论数。所以,我使用此代码。效果很好。ifmodel==\'post\':return_group.fbuser_set.filter(po... 查看详情

在使用 ORM 的 Django 中,如何对不同的值进行多个自连接

】在使用ORM的Django中,如何对不同的值进行多个自连接【英文标题】:InDjangousingORM.,howtodomultipleselfjoinondifferentvalues【发布时间】:2018-01-1023:27:00【问题描述】:谁能帮助我如何使用ORM在Django中针对不同的值编写多个自联接?例... 查看详情

如何编写高级 Django ORM 查询

】如何编写高级DjangoORM查询【英文标题】:HowwriteadvanceDjangoORMquery【发布时间】:2017-12-2201:13:39【问题描述】:为了简化事情,假设我有一个模型StockIOLog。classStockIOLog(models.Model):pid=models.IntegerField()name=models.CharField(max_length=50)type=... 查看详情

如何在 django orm 中使用 Annotation 进行嵌套 Group By?

】如何在djangoorm中使用Annotation进行嵌套GroupBy?【英文标题】:HowtodonestedGroupBywithAnnotationindjangoorm?【发布时间】:2021-11-2423:18:33【问题描述】:我有以下数据:publishertitle-------------------------------------------------------------NewAgeBooksLife 查看详情

django之orm(代码片段)

...RM的优势四,ORM的劣势五,ORM总结二,Django中的ORM一,Django项目使用MySQL数据库二,Model三,快速入门四,字段五,自定义字段六,字段参数七,ModelMeta参数八,多表关系和参数三,ORM操作一,基本操作二,进阶操作三,高级操作四,QuerySet相关方法Object... 查看详情

如何使用 Django 进行分组和聚合

】如何使用Django进行分组和聚合【英文标题】:HowtogroupbyANDaggregatewithDjango【发布时间】:2012-11-0409:53:34【问题描述】:我想通过ORM进行一个相当简单的查询,但无法弄清楚..我有三个模型:位置(地点)、属性(地点可能具有的... 查看详情

使用 python 在 Django 中进行高级搜索

】使用python在Django中进行高级搜索【英文标题】:AdvancedsearchinDjangousingpython【发布时间】:2018-08-2710:17:24【问题描述】:我目前正在研究django。现在,我想实现高级搜索,更具体地说,使用不精确的关键字实现精确搜索。例如,... 查看详情

django框架——orm增删改查django生命周期(代码片段)

...什么是ormORM即ObjectRelationalMapping,全称对象关系映射。2、使用orm的优缺点优点:不用写SQL语句开发效率高缺点:SQL的效率低3、使用orm如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可如果连接mysql,需要在配置文件... 查看详情

Django ORM:选择相关集

】DjangoORM:选择相关集【英文标题】:DjangoORM:Selectingrelatedset【发布时间】:2009-05-1214:50:25【问题描述】:假设我有2个模型:classPoll(models.Model):category=models.CharField(u"Category",max_length=64)[...]classChoice(models.Model):poll=models.ForeignK 查看详情

django框架--orm增删改查django生命周期(代码片段)

...什么是ormORM即ObjectRelationalMapping,全称对象关系映射。2、使用orm的优缺点优点:不用写SQL语句开发效率高缺点:SQL的效率低3、使用orm如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可如果连接mysql,需要在配置文件... 查看详情

Django ORM使用子查询按关键字搜索文本

】DjangoORM使用子查询按关键字搜索文本【英文标题】:DjangoORMsearchintextbykeywordswithSubquery【发布时间】:2018-10-1608:48:48【问题描述】:我在django中有两个模型。具有字段标题的文章模型和具有字段标题的关键字模型。我需要对数... 查看详情

Django ORM 类似于 Pony ORM 中的选择查询

】DjangoORM类似于PonyORM中的选择查询【英文标题】:DjangoORMlikeselectqueryinPonyORM【发布时间】:2021-09-2915:11:27【问题描述】:我现在要去PonyORM我已经创建了这样的数据库模型:classRSSSource(db.Entity):title=Required(str,max_len=100)link=Required(st... 查看详情

动态选择 django orm 列

】动态选择djangoorm列【英文标题】:selectdjangoormcolumnsdynamically【发布时间】:2017-02-0710:30:22【问题描述】:我有一个包含10个字段/列的报告表。我想允许用户动态选择他想要在报告中的哪些列。这可以在DjangoORM中完成吗例子如果... 查看详情