Theo như tôi biết, không có cách nào để chỉ định thứ tự phía cơ sở dữ liệu theo cách này vì nó sẽ quá cụ thể cho phụ trợ. Bạn có thể muốn dùng đến tốt phân loại Python old-fashioned:
class Foo(models.Model):
name = models.CharField(max_length=128)
Foo.objects.create(name='a10')
Foo.objects.create(name='a1')
Foo.objects.create(name='a2')
ordered = sorted(Foo.objects.all(), key=lambda n: (n[0], int(n[1:])))
print ordered # yields a1, a2, 10
Nếu bạn thấy mình cần loại này phân loại rất nhiều, tôi khuyên bạn nên thực hiện một phân lớp tùy chỉnh models.Manager
cho mô hình của bạn mà thực hiện việc đặt hàng. Một cái gì đó như:
class FooManager(models.Manager):
def in_a_number_order(self, *args, **kwargs):
qs = self.get_query_set().filter(*args, **kwargs)
return sorted(qs, key=lambda n: (n[0], int(n[1:])))
class Foo(models.Model):
... as before ...
objects = FooManager()
print Foo.objects.in_a_number_order()
print Foo.objects.in_a_number_order(id__in=[5, 4, 3]) # or any filtering expression
Nguồn
2009-05-19 16:03:55
điểm trên! Câu trả lời tuyệt vời, cảm ơn! –
Tôi gặp lỗi này khi thử phương pháp này:: \t Đối tượng 'Mô hình' không thể lập chỉ được – ninja123
Có 'sắp xếp' trả về bộ truy vấn không? Cho rằng nó đã được thông qua một queryset, tôi sẽ nghĩ như vậy, nhưng tôi nghĩ rằng nó cũng có thể được chuyển đổi thành một danh sách hoặc một cái gì đó nội bộ để phân loại, sau đó * rằng * được trả lại. –