Как лучше реализовать модели в бд?
Здравствуйте. Снова я здесь со своими вопросами)
Как лучше реализовать структуру моделей для файлов?
Хочу хранить файлы в отдельной модели или моделях (это уже как вы мне подскажите).
Ну так вот, какая схема лучше подойдёт?
1. Делать несколько моделей, которые имеют отношения OneToOne с моделью File.
2. Или же одну модель File, где будет поле file_type.
Мне чутьё подсказывает, что 1-ый вариант лучше использовать, если пригодятся какие-то дополнительные поля для каждого типа файла, а во всех остальных 2-ой.
1.
class File(models.Model): pass class AbstractFile(models.Model): filename = models.FileField(upload_to='files') file = models.OneToOneField(File, on_delete=models.CASCADE, primary_key=True) date = models.DateTimeField(auto_now_add=True, null=True, blank=True) class Meta: abstract = True def delete(self, *args, **kwargs): self.file.delete() return super(self.__class__, self).delete(*args, **kwargs) class Image(AbstractFile): filename = models.ImageField(upload_to='images') class Document(AbstractFile): pass
2.
class File(models.Model): DOCUMENT = 0 IMAGE = 1 AUDIO = 2 VIDEO = 3 FILE_TYPE_CHOICES = ( (DOCUMENT, 'Документ'), (IMAGE, 'Изображение'), (AUDIO, 'Видео'), (VIDEO, 'Аудио') ) file_type = models.PositiveSmallIntegerField(choices=FILE_TYPE_CHOICES, default=DOCUMENT) file = models.FileField(upload_to='files')
И ещё... Как можно сделать, чтобы в 1-ом варианте можно было к File связать только с одним объектом. Допустим два объекта Image я не могу связать через OneToOne с File, это понятно, но можно 1 Image и 1 Document. Как сделать, чтобы можно было связать только с одной либо Image, либо Document...?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
я думаю, правильнее всего начать с того, какую задачу вы пытаетесь решить.
по большому счету imageField отличается от FileField только проверками, что в поле приехала именно картинка
Ну получается тогда, что если мне пока не нужны дополнительные поля для каждого типа файла, то лучше использовать одну модель File.
Я просто думал на всякий случай сделать, может пригодится. Видимо, раз сейчас надобности нет, сделаю одну модель File.
я думаю, если это вдруг отвечает вашим хотелкам, вы можете сделать 2 разные формы для этого, в одной из которых сделать поле ImageField (со всеми вытекающими проверками), а в другой оставить FileField. Но в обоих случаях все складывать в одну модель с типом поля FileField.
Но в любом случае, не зная предметную область, очень сложно дать какой-то вменяемый ответ. Лучше всего всегда начинать с описания, что вы хотите сделать - так будет проще=)
кстати, из интересного - не обязательно указывать OneToOne на модель=)
если хотите наследоваться - надо указать в File.Meta.abstract = True
Хорошо. Вот подробности)
Делаю бота в telegram. Telegram каждому файлу загружаемому на их сервера даёт некий file_id. Мне нужно записывать это file_id в бд. И следующий раз не файл отправлять пользователю, а этот file_id.
Сейчас у меня есть модель Image. И есть FileID, которая хранит file_id каждой картинки.
Также у меня есть модель TelegramBot, так как ботов целых 2 штуки. Связи с этим в модель FileID добилось поле bot, которая хранит ссылку на бота. Так сделано потому что у одного файла может быть разный file_id, в зависимости от того в какой бот был загружен файл.
Вот модель FileID для наглядности
В поле name хранится тот самый file_id.
Всё это время я работал только с картинками, но теперь нужно добавить и другие файлы.
Поэтому решил сделать отдельную модель File, ссылку на которую добавлю в FileID вместо Image.
Ещё появилась мысля сделать, отдельно модели Image, Document, Video, Audio. А в FileID использовать GenericForeignKey.
Или сделать так:
А при сохранении разрешить только один тип файла.
Я уже, честно говоря, запутался.
а почему бы не сделать одну модель, например Attachement со всеми этими полями, и в зависимости от действия пользователя, например, "добавить документ", "добавить картинку" и т.д. класть все это в разные поля?