我正在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中查找序列?
答案 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]