1

事前定義された選択肢があるフィールドを使用して、Djangoアプリでモデルを注文しようとしています。アルファベット順に並べ替えることはできますが、選択できるのは曜日であるため、必要なものとは完全には一致しません。モデルは次のとおりです。

class Slot( models.Model ):

    DAY_CHOICES = (
        ('SUN', 'Sunday'),
        ('MON', 'Monday'),
        ('TUE', 'Tuesday'),
        ('WED', 'Wednesday'),
        ('THU', 'Thursday'),
        ('FRI', 'Friday'),
        ('SAT', 'Saturday'),
    )

    day = models.CharField( max_length=3, choices=DAY_CHOICES )
    start = models.TimeField()
    end = models.TimeField()
    template = models.ForeignKey( Template )

モデルを管理者ビューにプルするインラインは次のとおりです。

class SlotInline( admin.TabularInline ):
    model = Slot
    ordering = ('day','start',)

保存された値としておそらく整数を使用できることは知っていますが、選択肢のあるフィールドにカスタムの並べ替え順序を課す一般的な方法はありますか?

4

5 に答える 5

2

データを整数(たとえば、0 =日曜日)として格納し、選択肢を使用してその整数を日にマップする必要があります。そうすれば、ソートは簡単です。

于 2012-06-17T21:53:11.257 に答える
1

https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choicesの最後の段落からの引用:

ただし、ハッキングの選択肢が動的であることに気付いた場合は、ForeignKeyを使用して適切なデータベーステーブルを使用することをお勧めします。選択肢は、変更がほとんどない静的データを対象としています。

ですから、答えはノーだと思います。注文用のフィールドを備えた別のDayモデルを使用したほうがよいでしょう。

class Day(models.Model):
    name = models.CharField(max_length=9)
    ordering = models.PositiveIntegerField()

    class Meta:
        ordering = ['ordering']

7アイテムはやり過ぎのように感じますが!

于 2012-06-25T16:18:37.340 に答える
0

管理ビューを使用するのではなく、独自のビューを作成している場合は、生のSQLで順序付けを行うことができる可能性があります。私は以前、Oracleで次のような方法でこれを実行しました。

ORDER BY decode(day, 'SUN', 0, 'MON', 1 )

それをどのように適合させるかはわかりません。直接SQLを使用してクエリを実行するQuerySet.order_by()ために使用する必要があるかもしれません。QuerySet.raw()

于 2012-06-18T02:08:56.433 に答える
0

たぶんあなたはこのライブラリを見る必要があります:https ://github.com/bigjason/django-choices

関数名を指定できるフィールドとは異なり、そのようなことを行うための基本的なことはわかりませんが、順序付けでそれを行うことはできません。あなたができる唯一の特別なことはget_orderingを指定することです。

于 2012-06-20T09:20:34.640 に答える
0

を使用することもできますextraが、実装は適切ではない可能性があり、複雑なクエリやさまざまな選択肢を調整する必要があります。

# generate 'WHEN foo THEN bar's
switch = ' '.join("WHEN '{}' THEN {}".format(x[0],i) for i,x in enumerate(Slot.DAY_CHOICES))
# basic queryset
Slot.objects.extra(select={'day_index':'CASE day {} END'.format(switch)}).order_by('day_index', 'start')
于 2012-06-20T12:58:03.007 に答える