Как лучше реализовать модели в бд?
Здравствуйте. Снова я здесь со своими вопросами)
Как лучше реализовать структуру моделей для файлов?
Хочу хранить файлы в отдельной модели или моделях (это уже как вы мне подскажите).
Ну так вот, какая схема лучше подойдёт?
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...?
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 10:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 8:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 8:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-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 со всеми этими полями, и в зависимости от действия пользователя, например, "добавить документ", "добавить картинку" и т.д. класть все это в разные поля?