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 )

我不知道您如何适应它QuerySet.order_by()- 也许您需要使用QuerySet.raw()直接 SQL 进行查询。

于 2012-06-18T02:08:56.433 回答
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 回答
0

也许你应该看看这个库:https ://github.com/bigjason/django-choices

我不知道做这种事情的任何基本知识,与可以指定函数名称的字段不同,您不能在排序时这样做。您可以做的唯一特殊的事情是指定 get_ordering。

于 2012-06-20T09:20:34.640 回答