Поле видео в Django содержит url или файл

Как сделать только одно поле из этих двух полей?

`class MyModel(models.Model): field1 = models.FileField(blank=True) field2 = models.UrlField(blank=True)

def clean(self):
    if not self.field1 and not self.field2:
        raise ValidationError({'field1': 'Even one of field1 or field2 should have a value.'})
    elif self.field1 and self.field2:
        raise ValidationError({'field1': 'Even one of field1 or field2 should have a value.'})

#Example
if self.field1:
    video = self.field1
else:
    video = self.field2`

В Django поле видео - это тип поля, позволяющий хранить видеофайлы в вашей базе данных. Вы можете использовать FileField или ImageField с атрибутом upload_to для хранения видеофайлов. Вы также можете хранить URL-адреса видео в поле URLField или TextField, если хотите вставлять видео с других сайтов. Это зависит от вашего случая использования и требований проекта.

from django.db import models

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

поле video - это поле FileField, которое позволяет загружать видеофайлы. Атрибут upload_to указывает подкаталог в вашем MEDIA_ROOT, где будут храниться файлы.

Иметь только один вариант

Самым простым решением может быть не принимать 2 различных типа и поддерживать только загрузку изображения или URL изображения. Я бы предложил загружать только изображения, если вы собираетесь реализовать это решение.

Однако, если наличие этих двух вариантов является обязательным требованием, вы можете взглянуть на решения, которые я перечислил ниже.

Проверка на уровне контроллера (Простое решение)

Одним из решений является проверка того, заполнены ли оба поля на уровне контроллера, или View на жаргоне django. Если оба поля заполнены, вы можете выдать какую-нибудь ошибку и обработать ее оттуда.

Изменение модели и обработка на уровне обслуживания (рекомендуется)

Вышеуказанное решение может сработать, но это не будет идеальным решением в долгосрочной перспективе.

Я бы рекомендовал вам изменить вашу модель, чтобы в ней был только FileField, тогда на сервисном уровне вы сможете напрямую загружать, если пользователь загружает файл, однако если пользователь передает URL, вы сможете загрузить изображение и сохранить его.

Вы также можете сделать поле DB UrlField, и если пользователь загружает файл, вы можете загрузить его во внешнее хранилище, например s3 или cloudinary, и сохранить URL в вашей базе данных.

Что касается ограничения, вы можете применить ограничение, как указано выше в решении 2 о добавлении ограничения в контроллер или другим способом, используя магию django.

Вернуться на верх