Django视频字段包含url或文件

6qfn3psc  于 2023-01-31  发布在  Go
关注(0)|答案(2)|浏览(134)

如何使这两个字段中只有一个字段?有可能吗?

class MyModel(models.Model):
    video_file = models.FileField(blank=True)
    video = models.URLField(blank=True)

    def clean(self, *args, **kwargs):
        if not self.video_file and not self.video:  # This will check for None or Empty
            raise ValidationError({'video_file': 'Even one of field1 or field2 should have a value.'})
        elif self.video_file and self.video:  # This will check for None or Empty
            raise ValidationError({'video_file': 'Even one of field1 or field2 should have a value.'})
        if self.video == '':
            self.video = self.video_file.url
            super(MyModel, self).save(*args, **kwargs)```
**UPDATED**
I think this is the solution, my bad.
xkftehaa

xkftehaa1#

只有一个选择

最简单的解决方案可能是不接受两种不同的类型,只支持图像上传或图像URL。我建议只有当你要实现这个解决方案的图像上传。
然而,如果有这两个选项是一个要求,你可以看看我下面列出的解决方案。

在控制器级别检查(简单解决方案)

一个解决方案是检查两个字段是否都在控制器级别填充,或者用django术语来说是View,如果都填充了,你可以抛出一些错误并在那里处理。

在服务级别更改型号和处理(推荐)

上面的解决方案可能会起作用,但从长远来看,这不是理想的解决方案。
我建议你改变你的模型,只有一个FileField,然后在服务层,你可以直接上传,如果用户上传一个文件,但如果用户通过一个URL,你可以下载图像并保存它。
您也可以将DB字段设置为UrlField,如果用户上传文件,您可以将其上传到一些外部存储桶,如s3或cloudinary,并将URL保存在数据库中。
至于约束,你可以像上面提到的在控制器中添加约束的解决方案2中那样应用约束,或者使用django magic以其他方式应用约束。

vq8itlhq

vq8itlhq2#

在Django中,视频字段是一种允许你在数据库中存储视频文件的字段。你可以使用带有upload_to属性的FileField或ImageField来存储视频文件。如果你想嵌入来自其他网站的视频,你也可以在URLField或TextField中存储视频URL。这取决于你的用例和项目的要求。

from django.db import models

class MyModel(models.Model):
    video = models.FileField(upload_to='videos/')

video字段是一个允许你上传视频文件的文件字段。2 upload_to属性指定了你的MEDIA_ROOT中的子目录,文件将被存储在那里。

相关问题