Django: ordering numerical value with order_by

前端 未结 8 1933
陌清茗
陌清茗 2020-12-01 08:11

I\'m in a situation where I must output a quite large list of objects by a CharField used to store street addresses.

My problem is, that obviously the data is ordere

8条回答
  •  没有蜡笔的小新
    2020-12-01 08:40

    In case you need to sort version numbers consisting of multiple numbers separated by a dot (e.g. 1.9.0, 1.10.0), here is a postgres-only solution:

    class VersionRecordManager(models.Manager):
    
        def get_queryset(self):
            return super().get_queryset().extra(
                select={
                    'natural_version': "string_to_array(version, '.')::int[]",
                },
            )
    
        def available_versions(self):
            return self.filter(available=True).order_by('-natural_version')
    
        def last_stable(self):
            return self.available_versions().filter(stable=True).first()
    
    class VersionRecord(models.Model):
        objects = VersionRecordManager()
        version = models.CharField(max_length=64, db_index=True)
        available = models.BooleanField(default=False, db_index=True)
        stable = models.BooleanField(default=False, db_index=True)
    

    In case you want to allow non-numeric characters (e.g. 0.9.0 beta, 2.0.0 stable):

    def get_queryset(self):
        return super().get_queryset().extra(
            select={
                'natural_version':
                    "string_to_array(                     "  
                    "   regexp_replace(                   "  # Remove everything except digits
                    "       version, '[^\d\.]+', '', 'g'  "  # and dots, then split string into
                    "   ), '.'                            "  # an array of integers.
                    ")::int[]                             "
            }
        )
    

提交回复
热议问题