天道酬勤,学无止境

Order by split string django orm

问题

我有一个 ID 作为参考号和年份,格式如下:

1/17
98/15
2/17
112/17
2345/17
67/17
9/17
8974/16

当我使用 django orm 获取我的 ID 时:

obj = MyIDs.objects.filter(run='run_1').order_by('ID')

我按照第一个数字的顺序将它们取出:

1/17
112/17
2/17
2345/17
67/17
8974/16
9/17
98/15

但是,由于 / 后面的数字是年份,我想按年份然后数字来订购它们。 我可以在 mySQL 中轻松做到这一点(使用子字符串索引等),如果它是一个 python 列表,但我现在不想在将它们发送到我的 html 模板之前处理我的对象 - 有没有办法做到这一点在 orm?

回答1
MyIDs.objects.filter(run='run_1').annotate(
    slash_pos=StrIndex(F('id'), '/')
).annotate(
    y=Substr(F('id'), F('slash_pos'))
).order_by('y', 'id')

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Order by split string django orm
    I have an ID as a reference number and year in this format: 1/17 98/15 2/17 112/17 2345/17 67/17 9/17 8974/16 When i get my IDs out using django orm: obj = MyIDs.objects.filter(run='run_1').order_by('ID') I get them out in the order of the first number: 1/17 112/17 2/17 2345/17 67/17 8974/16 9/17 98/15 However as the number after the / is the year, I would like to order them by the year then number. I am able to do this easily in mySQL (using substring index etc) and also if it was a python list, but as I am now wanting to not process my objects before sending them to my html template - is
  • Django Order_BY 自定义函数(Django Order_BY custom function)
    问题 我在模型roll_numb有字段。 roll_numb值如下。 070-001 070-007 070-343 080-002 080-008 当我order_by roll_numb排序时,就像上面一样。 我想将 roll_numb 拆分为-并按余数排序。 (即 001、002、008) 代码 class Meta: ordering = ['roll_numb'] 回答1 我认为这是不可能的订购queryset的方法model在Django的ORM范围。 因此,为了您的排序queryset由您自定义的方法,我推荐2种方式: 第一的 qs = mymodel.objects.all() qs = sorted(qs, key: lambda i: i.roll_numb().split('-')[1]) 第二 将另一个字段添加到您的模型中,以便启用 Django 的 ORM 以按所需值排序: MyModel(models.Model): class Meta: ordering = ['roll_numb_splitted'] roll_numb_splitted = models.Charfield(max_length=3) def save(self, *args, **kwargs): # this is a check to run once if not
  • Django根据模型中的另一个字段列出一个字段分组列表(Django making a list of a field grouping by another field in model)
    问题 我有一个名为MyModel的模型,该模型具有一些伪数据,如下所示: item date value ------------------------------ ab 8/10/12 124 ab 7/10/12 433 ab 6/10/12 99 abc 8/10/12 23 abc 7/10/12 80 我想以这种方式查询此模型,如下所示: [{'item': 'ab', 'values': [ 124, 433, 99]}, {'item': 'abc', 'values': [ 23, 80]}] 我如何使用django ORM做到这一点? 回答1 (2016年4月4日)更新:这是Django <= 1.7的有效解决方案。 对于较新的版本,请阅读文档中的创建自己的聚合函数。 使用从此处获取的定制Concat聚合(有关该主题的文章) 定义这个: class Concat(models.Aggregate): def add_to_query(self, query, alias, col, source, is_summary): #we send source=CharField to prevent Django from casting string to int aggregate = SQLConcat(col, source=models.CharField
  • 2021-05-21<Django框架二>
    目录 一、回顾 WEB框架: 二、模板语法 Django模板语法 标签 模板继承 模板加载 ORM介绍 ORM使用 数据库常用字段 ORM基本查询 一、回顾 WEB框架: 将数据放到页面上 页面加载: Django : 大而全的web框架。 沙箱环境:anaconda沙箱。 1. 创建项目 django-admin startproject 项目名称 python manage.py startapp app名称 2. 启动项目 python manage.py runserver [ip:port] 拆分思维: 加载页面,返回给用户。 实现步骤 配置文件 """ ……… """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) …… INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages'
  • django admin 搜索多个词(django admin search with multiple words)
    问题 当搜索表达式有多个词时,我在使用search_fields时遇到麻烦,我想执行开始搜索 我有一堂课 class Foo(models.Model): kw = models.CharField(max_length = 255) ... class FooAdmin(admin.ModelAdmin): search_fields = ('^kw',) '^'表示我要执行开始搜索。 如果我正在寻找 kw 'foo fuu',django 将执行查询: select * from app_foo where `foo`.`kw` like 'foo%' and `foo`.`kw` like 'fuu%' 这个查询显然给出了零结果。 我该怎么做才能让引擎寻找'foo fuu%' ? 回答1 如何覆盖self.query所以split()不起作用? from django.contrib.admin.views.main import ChangeList class UnsplitableUnicode(str): "An object that behaves like a unicode string but cannot be split()" def split(self, *args, **kwargs): return [self] class
  • 从不同类别获取最新对象的Django查询(Django Query That Get Most Recent Objects From Different Categories)
    问题 我有两个模型A和B 所有B对象都有一个A对象的外键。 给定一组A对象,无论如何都可以使用ORM来获取一组B对象,其中包含为每个A对象创建的最新对象。 这是一个简化的示例: class Bakery(models.Model): town = models.CharField(max_length=255) class Cake(models.Model): bakery = models.ForeignKey(Bakery, on_delete=models.CASCADE) baked_at = models.DateTimeField() 因此,我正在寻找一个查询,该查询返回在美国Anytown的每个面包店中烘烤的最新蛋糕。 回答1 据我所知,在Django ORM中没有单步执行此操作的方法。 但是您可以将其分为两个查询: from django.db.models import Max bakeries = Bakery.objects.annotate( hottest_cake_baked_at=Max('cake__baked_at') ) hottest_cakes = Cake.objects.filter( baked_at__in=[b.hottest_cake_baked_at for b in bakeries] ) 如果蛋糕的ID与bake
  • Django ORM可以对列的特定值执行ORDER BY吗?(Can Django ORM do an ORDER BY on a specific value of a column?)
    问题 我有一个带有以下各列的表“票” id-主键-自动递增标题-varchar(256) status-smallint(6)-可以具有1-5之间的任何值,由Django处理 当我执行SELECT *我希望status = 4的行位于顶部,其他记录将跟随它们。 可以通过以下查询来实现: select * from tickets order by status=4 DESC 可以通过Django ORM执行此查询吗? 哪些参数应该传递给QuerySet.order_by()方法? 回答1 q = Ticket.objects.extra(select={'is_top': "status = 4"}) q = q.extra(order_by = ['-is_top']) 回答2 我在将Django与PostgresSql结合使用时做到了这一点。 from django.db.models import Case, Count, When Ticket.objects.annotate( relevancy=Count(Case(When(status=4, then=1))) ).order_by('-relevancy') 它将返回票证中的所有对象,但状态为4的票证将在开始处。 希望有人会发现它有用。 回答3 对于那些像我这样需要帮助的人,现在偶然发现了这个问题
  • 过滤 Django ORM 中的 order_by 关系(filtering the order_by relationship in Django ORM)
    问题 在下面,产品通过贡献者有很多作者, contributor.role_code定义了对产品做出的确切贡献类型。 Django ORM 是否可以过滤下面的 order_by() 方法引用的贡献者? 例如,我只想按贡献者订购产品,例如, contributor.role_code in ['A01', 'B01'] 。 Product.objects.filter( product_type__name=choices.PRODUCT_BOOK ).order_by( 'contributor__writer__last_name' # filter which contributors it uses? ) 回答1 您可以通过注释子查询执行此操作: 定义代表我们想要订购的东西的子查询使用子查询注释原始 QuerySet 按注释排序。 contributors_for_ordering = Contributor.objects.filter( # 1 product=OuterRef('pk'), role_code__in=['A01', 'B01'], ).values('writer__last_name') queryset = Product.objects.filter( product_type__name=choices.PRODUCT_BOOK )
  • django-orm不区分大小写的顺序(django-orm case-insensitive order by)
    问题 我知道,我可以从DJango ORM运行不区分大小写的搜索。 喜欢, User.objects.filter(first_name__contains="jake") User.objects.filter(first_name__contains="sulley") User.objects.filter(first_name__icontains="Jake") User.objects.filter(first_name__icontains="Sulley") 而且,我可以将它们作为 user_list = User.objects.all().order_by("first_name") # sequence: (Jake, Sulley, jake, sulley) user_list = User.objects.all().order_by("-first_name") # for reverse # sequence: (sulley, jake, Sulley, Jake) 是否存在不区分大小写的直接获取方式? 正如我想要一个序列 # desired sequence: jake, Jake, sulley, Sulley 如果没有,那么建议一种最佳方法。 提前致谢。 回答1 这个答案已经过时,请使用django 1.8检查以下解决方案-> 我发现使用
  • django orm 和 postgresql 的累积(运行)总和(Cumulative (running) sum with django orm and postgresql)
    问题 是否可以使用 django 的 orm 计算累积(运行)总和? 考虑以下模型: class AModel(models.Model): a_number = models.IntegerField() 使用一组数据,其中a_number = 1 。 这样我在数据库中有一个数量( >1 )的AModel实例,所有实例都带有a_number=1 。 我希望能够返回以下内容: AModel.objects.annotate(cumsum=??).values('id', 'cumsum').order_by('id') >>> ({id: 1, cumsum: 1}, {id: 2, cumsum: 2}, ... {id: N, cumsum: N}) 理想情况下,我希望能够限制/过滤累积总和。 因此,在上述情况下,我想将结果限制为cumsum <= 2 我相信在 postgresql 中可以使用窗口函数实现累积总和。 这如何转换为 ORM? 回答1 作为参考,从 Django 2.0 开始,可以使用Window函数来实现此结果: AModel.objects.annotate(cumsum=Window(Sum('a_number'), order_by=F('id').asc()))\ .values('id', 'cumsum').order_by('id',
  • 在Django ORM中使用postgresql窗口函数的干净方法?(Clean way to use postgresql window functions in django ORM?)
    问题 我想在Django中需要使用的某些查询中使用诸如rank()和dense_rank类的postgresql窗口函数。 我可以在原始SQL中使用它,但是我不确定如何在ORM中执行此操作。 简化后看起来像这样: SELECT id, user_id, score, RANK() OVER(ORDER BY score DESC) AS rank FROM game_score WHERE ... 您将如何在ORM中执行此操作? 在某些时候,我可能还需要添加分区:| (我们在Python 3上使用Django 1.9,并且已经依赖于django.contrib.postgres功能) 回答1 自Django 2.0起,它已内置在ORM中。 查看视窗功能 # models.py class GameScore(models.Model): user_id = models.IntegerField() score = models.IntegerField() # window function usage from django.db.models.expressions import Window from django.db.models.functions import Rank GameScore.objects.annotate(rank=Window(
  • Django ORM orderby 精确/突出匹配位于顶部(Django ORM orderby exact / prominent match to be on top)
    问题 我需要根据 Django ORM 中的匹配长度对结果进行排序。 我有一个Suburb表, name字段中包含位置详细信息。 我需要用给定的文本和顺序搜索表格,按完全匹配/最突出的匹配作为顶部 例如: 1) 如果搜索字符串是 'America' 那么结果应该是 [America, South America, North America ..] 在这种情况下我们找到了一个完整的匹配,它必须是第一个元素。 2) 如果搜索是port那么结果应该是 ['Port Melbourne' 'Portsea', East Airport ] 在这种情况下,我们发现 port 在分隔符之前是完全匹配的。 我知道我可以使用多个查询并加入它们,例如一个用于完全匹配,另一个用于部分匹配,然后在部分匹配时使用 exclude 加入它们,例如 search_list= [x.name for x in Suburb.objects.filter(name=search)] # Then search_list += [x.name for x in Suburb.objects.filter(name__iregex=r"[[:<:]]{0}".format(search)).exclude(name__in=search_list)] 我可以继续这样。 但是想知道我们是否有更好的方法。 任何线索?
  • 我可以从Django ORM查询中删除ORDER BY吗?(Can I remove ORDER BY from a Django ORM query?)
    问题 似乎Django默认情况下将ORDER BY添加到查询中。 我可以清除吗? from slowstagram.models import InstagramMedia print InstagramMedia.objects.filter().query SELECT `slowstagram_instagrammedia`.`id`, `slowstagram_instagrammedia`.`user_id`, `slowstagram_instagrammedia`.`image_url`, `slowstagram_instagrammedia`.`video_url`, `slowstagram_instagrammedia`.`created_time`, `slowstagram_instagrammedia`.`caption`, `slowstagram_instagrammedia`.`filter`, `slowstagram_instagrammedia`.`link`, `slowstagram_instagrammedia`.`attribution_id`, `slowstagram_instagrammedia`.`likes_count`, `slowstagram_instagrammedia`.`type` FROM
  • 查询集排序:为 django ORM 查询指定列排序规则(Queryset sorting: Specifying column collation for django ORM query)
    问题 我开始调查为什么我的 Django Model.objects.filter(condition = variable).order_by(textcolumn) 查询没有以正确的顺序生成对象。 并发现它是数据库(Postgresql)问题。 在我之前的问题(Postgresql 排序语言特定字符(排序规则))中,我发现(在 zero323 的大量帮助下实际使其工作)我可以为每个数据库查询指定排序规则,如下所示: SELECT nimi COLLATE "et_EE" FROM test ORDER BY nimi ASC; 但据我所知,order_by 只接受字段名称作为参数。 我想知道,是否有可能扩展该功能以包括 collat​​ion 参数? 是否有可能以某种方式使用 mixins 或诸如此类的东西来破解它? 或者功能请求是现在唯一的方法吗? 我希望它会像这样工作: Model.objects.filter(condition = variable).order_by(*fieldnames, collation = 'et_EE') Edit1:显然我不是唯一一个要求这个的人:https://groups.google.com/forum/#!msg/django-developers/0iESVnawNAY/JefMfAm7nQMJ 艾伦 回答1 由于 Django
  • Python(Web篇)---Django框架【三】数据库ORM模块--ORM操作
    文章目录 一、基本操作(一)增(二)查(重点)1. 查询所有 all()2. 顺序查询 order_by()3. 查询部分 filter4. 查询一条5. 聚合查询6. 分组查询:annotate()7. F查询8. Q查询 (三)删(四)改 二、关系操作(一)一对一关系 OneToOneField(二)一对多关系 ForeignKey(三)多对多关系 ManyToManyField flask-sqlalchemy是对python三方的ORM sqlalchemy的封装,sqlalchemy是模仿Django的ORM编写,相较于Django ORM,sqlalchemy的操作比较复杂,但是迁移性比Django的ORM好。 一、基本操作 django 为了开发者学习或者测试使用orm,提供了交互式界面 python manage.py shell 进入含有当前项目结构的shell模式 (D:\Anaconda3\envs\D_37) F:\0831Pro\DjPro\Qshop>python manage.py shell Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license"
  • 如何告诉 Django ORM 颠倒查询结果的顺序?(How can I tell the Django ORM to reverse the order of query results?)
    问题 在我寻求了解针对 Django 模型的查询时,我一直在尝试使用如下查询获取最后 3 个添加的有效 Avatar 模型: newUserAv = Avatar.objects.filter(valid=True).order_by("date")[:3] 但是,这反而给了我按日期排序的前三个头像。 我确定这很简单,但是我在 Django 文档中找不到它:如何选择最后三个头像对象而不是前三个? 回答1 在字段名称前放置一个连字符。 .order_by('-date') 回答2 创建列表和 def messages_to_list(messages): result = [] for message in messages: result.append(message_to_list(message)) result.reverse() return result def message_to_list(message): return { 'member': str(message.member), 'message': str(message.message), 'pub_date': str(message.pub_date.strftime(" %B %d,%Y, %A %I:%M%p ")), 'admin': message.admin } 上面的结果将按 pub
  • Django orm 按多列分组(Django orm group by multiple columns)
    问题 如何在 Django 中执行多列组? 我只看到了一个列 group by 的例子。 下面是我试图转换为 Django ORM 的查询。 SELECT order_id,city,locality,login_time,sum(morning_hours),sum(afternoon_hours),sum(evening_hours),sum(total_hours) FROM orders GROUPBY order_id,city,locality,login_time` 回答1 from django.db.models import Sum Your_Model.objects.values('order_id', 'city', 'locality', 'login_time').order_by().annotate(sum('morning_hours'), sum('afternoon_hours'), sum('evening_hours'), sum('total_hours')) 我希望上面的代码片段有所帮助(在回答时,我不知道上午、下午等是否是表中的派生列或现有字段,因为您没有在问题中指定任何类型。因此,我做了我的假设并回答了您的问题)。 对于按多列分组,SO 上已经存在一个问题。 请参阅此链接。
  • 如何在Django ORM中执行GROUP BY…COUNT或SUM?(How to execute a GROUP BY … COUNT or SUM in Django ORM?)
    问题 序幕: 这是在SO中经常出现的一个问题: Django模型分组依据相当于Django的计数和分组依据如何在Django中以GROUP BY查询? 如何使用ORM等效于SQL计数,分组和联接查询? 我已经编写了一个关于SO文档的示例,但是由于该文档将于2017年8月8日关闭,因此,我将遵循这一广受好评和讨论的元答案的建议,并将我的示例转换为自回答帖子。 当然,我也很高兴看到任何其他方法!! 问题: 假设模型: class Books(models.Model): title = models.CharField() author = models.CharField() price = models.FloatField() 如何使用Django ORM在该模型上执行以下查询: GROUP BY ... COUNT : SELECT author, COUNT(author) AS count FROM myapp_books GROUP BY author GROUP BY ... SUM : SELECT author, SUM (price) AS total_price FROM myapp_books GROUP BY author 回答1 我们可以分别使用annotate(),values(), django.db.models的Count和Sum方法在Django
  • Django ORM按一列分组并返回其他(Django ORM group by one column and return other)
    问题 在简单的世界中,我尝试在 Django 中编写一个将返回结果的查询 与此类似: select id, max(score), screen, details from results group by screen where user_id=123 order by score desc, screen 我的代码: results = Results.objects.filter(user=user).values('screen').annotate(score=Max('score')).order_by('-score', 'screen') 但我不返回结果对象而是 json。 我想得到结果作为结果对象 user = User.objects.filter(id=id) results = Results.objects.filter(user=user).order_by('-score', 'screen') 任何人都可以帮忙吗? 回答1 是 values() 调用将您的QuerySet转换为dicts列表。 如果您想将其保留为QuerySet ,但仅从您感兴趣的数据库中检索字段,请使用 only(*fields) 或 defer(*fields) results = Results.objects.filter(user=user) .annotate
  • 删除Django ORM中的重复项-多行(Remove duplicates in Django ORM — multiple rows)
    问题 我有一个具有四个字段的模型。 如何从数据库中删除重复的对象? 丹尼尔·罗斯曼(Daniel Roseman)对这个问题的回答似乎是适当的,但是我不确定如何将其扩展到每个对象有四个字段进行比较的情况。 谢谢, W. 回答1 def remove_duplicated_records(model, fields): """ Removes records from `model` duplicated on `fields` while leaving the most recent one (biggest `id`). """ duplicates = model.objects.values(*fields) # override any model specific ordering (for `.annotate()`) duplicates = duplicates.order_by() # group by same values of `fields`; count how many rows are the same duplicates = duplicates.annotate( max_id=models.Max("id"), count_id=models.Count("id") ) # leave out only the ones which are