我正在使用此代码
episodes=Episode.objects.filter().order_by('name')
我得到的结果是
episode 1
episode 10
episode 11
episode 12
episode 2
相反,我希望结果为
episode 1 episode 2 episode 10 episode 11
可能最好将剧集编号存储为一个 int 字段并按此排序。
class Episode(models.Model):
episode_num = models.IntegerField()
def __unicode__(self):
return 'episode {}'.format(self.episode_num)
Episode.objects.order_by('episode_num')
如果剧集名称在剧集名称和剧集编号之间有空格作为分隔符,那么您可以按照以下过程进行操作。您的架构设计是错误的。
但是,如果您想继续使用它,我会告诉您方法。根据编码,性能基础可能不是很好的解决方案,但仍然可以满足您的要求。
请看下面的代码。
####剧集列表 Episodes = [str(a[0]) for a in Episode.objects.filter().values_list('name')] #情节排序 sorted_episodes = sorted(episodes, key=lambda x:x.split(' ')[-1] in episodes) 打印 sorted_episodes
您的数据库架构结构错误。
Django ORM 查询最终被翻译成 SQL。您不能直接在任何 db 列中进行这种排序。
至少,您应该将系列名称与剧集编号分开。
class Episode(models.Model):
name = models.CharField()
num = models.IntegerField()
Episode.objects.order_by('name', 'num')
剧集将按其系列名称按字母顺序排序,然后按剧集编号按数字顺序排序。
根据我的经验,在大多数情况下,即使是上面的结构也不够好。剧集名称实际上是系列名称,它应该分开到另一个表中。我将创建这样的模型:
class Series(models.Model):
name = models.CharField()
...
class Episode(models.Model):
series = models.ForeignKey('Series')
num = models.IntegerField()