Вложенные модели в django

#python #django #nested

#python #django #вложенные

Вопрос:

У меня есть приложение django с моделью под названием Folder, пользователь может создать папку с полем name. я хочу сделать эту модель папки вложенной, чтобы пользователь мог создавать папки внутри папки. Например, пользователь создал папку с именем ABC и попал в DetailView этой папки и создал другую папку DEF, а затем попал в DEF и создал другую папку с именем GHI и так далее.

Я довольно новичок в django, я связал поиск в Интернете, но ничего не получил.

models.py

 from django.db import models
from django.contrib.auth.models import User
from django.db.models.deletion import CASCADE
from django.core.validators import MinValueValidator
from django.core.exceptions import PermissionDenied

# The Folders Model.

class Folder(models.Model):
    name = models.CharField(max_length = 250)
    cr_date = models.DateTimeField(auto_now_add = True)
    def __str__(self):
        return "%s" % self.name
  

views.py

 import requests
from django.shortcuts import render
from django.views.generic.base import TemplateView
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.views.generic.list import ListView
from ahmed_drive.models import Folder
from . import models
from django.views.generic.detail import DetailView
from django.db.models import Q
from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.http.response import HttpResponseRedirect

#### Normal Pages Related Views ####

class HomeView(TemplateView):
    template_name = "ahmed_drive/home.html"


#### Pages Related Folder Model ####

@method_decorator(login_required, name="dispatch")    
class FolderCreate(CreateView):
    model = Folder
    fields = ["name"]
    def form_valid(self, form):
        self.object = form.save()
        self.object.save()

@method_decorator(login_required, name="dispatch") 
class FolderListView(ListView):
    model = Folder
    def get_queryset(self):
        si = self.request.GET.get("si")
        if si == None:
            si = ""
        folderList = Folder.objects.filter(Q(name__icontains = si)).order_by("-id");
        return folderList
@method_decorator(login_required, name="dispatch") 
class FolderDetailView(DetailView):
    model = Folder
  

Комментарии:

1. посетите документацию django-mptt, я думаю, это вам поможет. django-mptt.readthedocs.io/en/latest

Ответ №1:

Наиболее распространенный способ сделать это — использовать самореляционные ForeignKey .

 # The Folders Model.

class Folder(models.Model):
    name = models.CharField(max_length = 250)
    parent = models.ForeignKey('self')
    cr_date = models.DateTimeField(auto_now_add = True)
    def __str__(self):
        return "%s" % self.name
  

Если вы хотите более продвинутое использование вложенных наборов, вы можете проверить django-mptt .