Skip to main content
 首页 » 编程设计

python之Django:存储多个动态排序的模型序列

2025年05月04日29txw1958

比方说,用户有视频剪辑和图像,它们都有相应的模型,VideoClipModel 和 ImageModel。

现在我正在添加一项新功能,用户可以在其中组合剪辑和图像来创建“最终”视频。现在我需要的是创建一个模型,我可以在其中存储视频剪辑和图像的序列。任何人都知道如何做到这一点?

例如:用户想要创建具有以下项目序列的最终视频:

Image1 -> VideoClip1 -> Image2 -> VideoClip2 -> VideoClip3 -> Image3 -> Image1 

我想做的是创建一个模型,我可以在其中存储所选序列

我想创建我的 VideoFinalModel,其中包含两个 m2m 字段到 ImageModel 和 VideoClipModel 以及一个 charfield,它将以类似于此的方式存储顺序:

image_1, video_1, image_2, video_2, video_3, image_3, image_1 

所以模型看起来像:

def VideoFinal(...): 
    videos = models.ManyToManyFIeld("VideoClips") 
    images = models.ManyToManyFIeld("Images") 
    order = models.CharField() 
 
def Images(...): 
    """ A bunch of fields here """ 
 
def VideoClips(...): 
    """ A bunch of different fields here """ 

现在,这会做我想做的……但是我不认为这是应该做的。

我怎样才能用 pythonic 方式做到这一点?

谢谢!

请您参考如下方法:

您可以拥有一个带有位置字段的模型 VideoComponent 以及指向 VideoClipModel 和 ImageModel 的外键。然后 Video 模型将有一个多对多的字段到 VideoComponent。

class Video(models.Model): 
    components = models.ManyToManyField('VideoComponent') 
 
class VideoComponent(models.Model): 
    image = models.ForeignKey('ImageModel') 
    video_clip = models.ForeignKey('VideoClipModel ') 
    position = models.IntegerField() 
 
    class Meta: 
        ordering = ['position'] 

获取有序组件:

 video.components.all() 

另请查看用于存储分层数据的 django-mptt:

The problem which django-mptt solves.

Project github.