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']
我认为在 Django 的 ORM 范围内无法通过 model
的方法来订购 queryset
。
因此,为了按照您的自定义方法对 queryset
进行排序,我推荐两种方法:
第一
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 self.pk:
self.roll_numb_splitted = self.roll_numb().split('-')[1]
return super(MyModel, self).save(*args, **kwargs)
使用自定义字段注释您的查询集:
from django.db.models.functions import Substr
YourModel.objects.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')
如果您希望始终订购您的模型,只需将该注释移至模型的管理器即可:
class YourModelManager(models.Manager):
def get_queryset(self):
qs = super(YourModelManager, self).get_queryset()
return qs.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')
class YourModel(models.Model):
objects = YourModelManager()
我在模型 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']
我认为在 Django 的 ORM 范围内无法通过 model
的方法来订购 queryset
。
因此,为了按照您的自定义方法对 queryset
进行排序,我推荐两种方法:
第一
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 self.pk:
self.roll_numb_splitted = self.roll_numb().split('-')[1]
return super(MyModel, self).save(*args, **kwargs)
使用自定义字段注释您的查询集:
from django.db.models.functions import Substr
YourModel.objects.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')
如果您希望始终订购您的模型,只需将该注释移至模型的管理器即可:
class YourModelManager(models.Manager):
def get_queryset(self):
qs = super(YourModelManager, self).get_queryset()
return qs.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')
class YourModel(models.Model):
objects = YourModelManager()