我正在尝试使用具有预定义选项的字段在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',)
我知道我可能会使用整数作为存储值,但是有一种通用方法可以在带有选项的字段上强加自定义排序顺序吗?
答案 0 :(得分:2)
您应该将数据存储为整数(例如0 =星期日),并使用选项将该整数映射到该日期。然后排序很简单。
答案 1 :(得分: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件物品感觉有点过分!
答案 2 :(得分:0)
如果您正在编写自己的视图而不是使用管理视图,则可以在原始SQL中进行排序。我之前在Oracle中做过这样的事情:
ORDER BY decode(day, 'SUN', 0, 'MON', 1 )
我不知道你如何适应QuerySet.order_by()
- 也许你需要使用QuerySet.raw()
来使用直接SQL进行查询。
答案 3 :(得分:0)
也许你应该看一下这个库:https://github.com/bigjason/django-choices
我不知道有什么基本要做这样的事情,不像你可以指定一个函数名的字段,你不能在订购时这样做。您可以做的唯一特殊事情是指定get_ordering。
答案 4 :(得分: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')