Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按字段和选项排序的订单模型_Python_Django_Django Models - Fatal编程技术网

Python 按字段和选项排序的订单模型

Python 按字段和选项排序的订单模型,python,django,django-models,Python,Django,Django Models,我试图在Django应用程序中使用具有预定义选项的字段来订购模型。我可以按字母顺序排序,但由于选择是一周中的几天,这与我需要的不太匹配。模型如下: class Slot( models.Model ): DAY_CHOICES = ( ('SUN', 'Sunday'), ('MON', 'Monday'), ('TUE', 'Tuesday'), ('WED', 'Wednesday'), ('THU',

我试图在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=星期日),并使用选项将该整数映射到日期。排序很简单。

如果您正在编写自己的视图,而不是使用admin视图,则可以使用原始SQL进行排序。我以前在Oracle做过类似的工作:

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

我不知道您如何将其与
QuerySet.order\u by()
-也许您需要使用
QuerySet.raw()
来使用直接SQL进行查询。

也许您应该看看这个库:


我不知道做这种事情的基本方法,不同于可以指定函数名的字段,你不能在排序中这样做。您可以做的唯一特殊的事情是指定get_ordering。

您可以使用
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')

引述以下文件最后一段:

但如果你发现自己的黑客选择是动态的,那么你就 最好使用带有ForeignKey的适当数据库表。 选择是为了静态数据,如果有变化,也不会有太大变化

所以我想说答案是否定的,你最好使用一个单独的日期模型,并带有一个订购字段

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

    class Meta:
        ordering = ['ordering']

尽管这感觉像是对7个项目的过度杀戮

我在问题中指出了这种方法——我正在寻找一种更一般的方法来按选择排序。在这种情况下它是有效的,但是当排序顺序需要更改时会发生什么呢?我不应该仅仅因为想以不同的方式显示模型就需要修改模型。