Нужен совет, как лучше реализовать модель статей и файлов на django?

Всем добрый день. Пришел за советом. Как лучше реализовать модели статьи и файлы, где будут одинаковые поля, но файлы будут лишь отличаться тем, что там будет на 2-3 поля больше. Категории те же самые.

Может сделать одну модель, но не заполнять некоторые поля, которые предназначены для файла? Но тут возникает то, что в файлах больше полей - мешать будут.

А фильтровать потом как их отдельно? Скорее только по категориям.

А возможно ли сделать так, чтоб допустим при добавлении с админки, или с сайта, мы могли выбрать будет это файл или статья? И для тех в последствии выводить нужные поля?

Если есть пример такой штуки, скиньте пожалуйста для изучения.


Ответы (1 шт):

Автор решения: Andrey Maslov

Попробуй наследование моделей. Определи базовую модель, в которой будут указаны общие для этих моделей поля. А затем в модели отвечающей за статьи и файлы опиши собственные поля

class BaseModel(models.Model):
    field1 = ...
    ...

    class Meta:
        abstract = True
        

class FileModel(BaseModel):
    file_field = ...
    ...


class Article(BaseModel):
    article_field = ...

фильтровать сможешь как обычно

   Article.objects.filter(...)
   FileModel.objects.filter(...)

затем при редактировании, соответственно, сможешь передавать какой-то доп. параметр, который будет отвечать за то, какая именно модель редактируется(либо проверять наличие определенных полей) и тогда подставлять ту форму, которая тебе нужна, например в файле forms.py

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article


class FileForm(forms.ModelForm):
    class Meta:
        model = FileModel

и тогда во view, который отвечает за редактирование

def file_or_article_edit_view(request, object_type='file'):
    available_form_classes = {
       'file': FileForm,
       'article': ArticleForm,
    }
    form_class = available_form_classes.get[object_type]
    form = form_class(request.POST or None)
    if request.POST and form.is_valid():
          form.save()
    
    return render(request, 'template_name.html', {
        'form': 'form',
    })       
→ Ссылка