Django - 如何在主题中订购一系列视频?

时间:2014-03-21 15:22:57

标签: mysql django

我正在django组建一个视频库。到目前为止,我有一些课程,每个课程都有一个主题,然后每个主题各有10-20个视频。

我想为主题中的每组视频提供订购。因此,当用户浏览课程时,视频会有特定的序列。

我的挑战是如何在我的数据库后端(mysql)中存储视频的顺序,以及如何查找和检索订单?我还希望有(上一个)和(下一个)链接,以便用户可以轻松点击序列。

起初我以为我会在我的视频模型上有一个“序列”int字段,然后查看它并简单地找到下一个或上一个。但是,如果在输入序列时跳过一个数字怎么办?我也想在每个序列中强制执行编号。

到目前为止,这是一些代码:

class Video(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=500, blank=True)
    topic = models.ForeignKey('VideoTopic')
    sequence = models.IntegerField(default=1, null=True, help_text="(Sequence within the topic)")

class VideoTopic(models.Model):
    name = models.CharField(max_length=200, blank=True)
    description = models.TextField(blank=True)
    course = models.ForeignKey('course.Course')

虽然这有点满足了排序的基本要求,但我没有看到如何强制执行排序,而且我也很难查找我的上一个/下一个视频。

我想我需要将序列存储在一个单独的表中,但我不能完全想到应该如何做到这一点。类似的东西:

class VideoSequence(models.Model)
    topic = models.ForeignKey('VideoTopic')
    sequence = models.IntegerField()
    video = models.ForeignKey('Video')

如果我使用上面的单独表格,我怎样才能在django中查找序列?

1 个答案:

答案 0 :(得分:0)

简单回答:

https://github.com/iambrandontaylor/django-admin-sortable

简单的回答:

执行此操作的标准方法是您已拥有的数字排序字段。如果要强制执行连续的订单索引,每次更改时都可以使用信号“重新索引”序列。

from django.db.models.signals import post_save

def update_sequence(sender, instance=False, created, **kwargs):
    qs = self.topic.video_set.all().order_by('sequence')
        counter = 1
        for video in qs:
            video.sequence = counter
            video.save()
            counter += 1

post_save.connect(update_sequence, sender=Video)

然后获取序列中的下一个/上一个项目:

models.py:

class Video(models.Model):
    ....
    class Meta:
        order_by = 'sequence'

    def get_next(self):
        return self.__class__.filter(sequence__gt=self.sequence)[0]

    def get_prev(self):
        return self.__class__.filter(sequence__lt=self.sequence)[-1]