如何使这两个字段中只有一个字段?有可能吗?
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.
2条答案
按热度按时间xkftehaa1#
只有一个选择
最简单的解决方案可能是不接受两种不同的类型,只支持图像上传或图像URL。我建议只有当你要实现这个解决方案的图像上传。
然而,如果有这两个选项是一个要求,你可以看看我下面列出的解决方案。
在控制器级别检查(简单解决方案)
一个解决方案是检查两个字段是否都在控制器级别填充,或者用django术语来说是
View
,如果都填充了,你可以抛出一些错误并在那里处理。在服务级别更改型号和处理(推荐)
上面的解决方案可能会起作用,但从长远来看,这不是理想的解决方案。
我建议你改变你的模型,只有一个
FileField
,然后在服务层,你可以直接上传,如果用户上传一个文件,但如果用户通过一个URL,你可以下载图像并保存它。您也可以将DB字段设置为
UrlField
,如果用户上传文件,您可以将其上传到一些外部存储桶,如s3或cloudinary,并将URL保存在数据库中。至于约束,你可以像上面提到的在控制器中添加约束的解决方案2中那样应用约束,或者使用django magic以其他方式应用约束。
vq8itlhq2#
在Django中,视频字段是一种允许你在数据库中存储视频文件的字段。你可以使用带有upload_to属性的FileField或ImageField来存储视频文件。如果你想嵌入来自其他网站的视频,你也可以在URLField或TextField中存储视频URL。这取决于你的用例和项目的要求。
video字段是一个允许你上传视频文件的文件字段。2 upload_to属性指定了你的MEDIA_ROOT中的子目录,文件将被存储在那里。