2

QuerySetこの場合、昇順で注文したいと思います。

PRIORITY_CHOICES = (
(1, "P1"),
(2, "P2"),
(3, "P3"),
(4, "P4"),
(5, "P5"),
)

class Task(models.Model):
     name = models.CharField(max_length=255)
     priority = models.PositiveIntegerField(choices=PRIORITY_CHOICES)

以来、優先度はNone値を受け入れることができます。問題は、ビューコードでこれを行うときにクエリセットを注文することです。

task_list = Task.objects.all().order_by("priority")

これにより、優先度の昇順でオブジェクトが配置され、最初にNone値が設定されたクエリセットが返されます。昇順のリストが必要ですが、最後にNoneの値を含めたいと思います。私は巨大なデータベースを持っているので、データベースレベルでこれを達成することに興味があります。

4

3 に答える 3

3

これはおそらくあなたの最良の選択肢です。

import itertools
q = itertools.chain(
        Task.objects.filter(priority__isnull=False).order_by("priority"),
        Task.objects.filter(priority__isnull=True))
# Then you can iterate over your custom order
result = [(x.name, x.priority) for x in q]
于 2012-08-02T01:38:06.667 に答える
1

(「-」記号を前に付ける)を使用して順序を降順に変更できますがqueryset.order_by('-field')、Djangoにはnullの並べ替え方法を指示する方法がありません。これはデータベース固有の動作です。降順を使用してもデータベースで最初にnull値が得られる場合はqueryset.extra(select={'order': 'custom_sql_function(priority)'}).order_by('order')、を使用します。ここで、custom_sql_functionフィールドがnullの場合は整数に変換され、データベースエンジンに固有です。パフォーマンスを向上させるために、にdbインデックスを作成できますfunction(field)

于 2012-08-02T01:33:39.600 に答える
0

このようなモデルでは、このように簡単に行うことができます

class ModelName(models.Model):
    feild_1 = models.CharField( max_length=150)
    feild_2 = models.CharField( max_length=150, blank=True, null=True)

    class Meta:
        ordering = [F('order').asc(nulls_last=True)]
于 2021-12-15T14:38:45.847 に答える