# Менеджеры моделей --- Manager - это интерфейс, через который для моделей Django предоставляются операции запросов к базе данных. По крайней мере, один Manager существует для каждой модели в приложении Django. --- По умолчанию Django добавляет Manager с именем objects в каждый класс модели Django. Однако, если вы хотите использовать objects в качестве имени поля или если вы хотите использовать имя, отличное от objects для Manager, вы можете переименовать его для каждой модели. --- Чтобы переименовать Manager для данного класса, определите атрибут класса типа models.Manager() для этой модели. Например: ``` from django.db import models class Person(models.Model): #... people = models.Manager() ``` --- Вы можете использовать настраиваемый Manager в конкретной модели, расширив базовый класс Manager и создав экземпляр своего настраиваемого Manager в своей модели. ``` from django.db import models class PublishedManager(models.Manager): def get_all_names(self): f = 0 for i in self.model.objects.all(): i.task = "dafault " + str(f) i.save() f += 1 ``` --- Добавляем менеджер в модель ``` class Tasks(models.Model): task = models.TextField(max_length=350) date = models.DateField() objects = PublishedManager() ``` --- Расширяем функционал компонента ``` from django_unicorn.components import UnicornView from Pages.models import Tasks class MainPageView(UnicornView): tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] new_task = '' new_date = '' def save(self): new_field = Tasks(task = self.new_task, date = self.new_date) new_field.save() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] self.new_task = '' self.new_date = '' def delete(self, pk): field = Tasks.objects.get(id = pk) field.delete() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] def set_to_default(self): Tasks.objects.get_all_names() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] ``` --- Исправляем шаблон ``` {% load unicorn %} <html> <head> {% unicorn_scripts %} </head> <body> <div unicorn:view> {% csrf_token %} <input type="text" unicorn:model.lazy="new_task" placeholder="New task" id="new_task"> <input type="text" unicorn:model.lazy="new_date" placeholder="New date" id="new_date"> <button unicorn:click="save">Add</button> {% if tasks %} {% for elements in tasks %} <p> {% for element in elements %} {% if forloop.counter == 3 %} <button unicorn:click="delete({{element}})">Delete</button> {% else %} {{element}} {% endif %} {% endfor %} </p> {% endfor %} <button unicorn:click="set_to_default">To default</button> <button unicorn:click="set_to_random">To random</button> {% endif %} </div> </body> </html> ``` --- Так же можно писать функции, напрямую влияющие на запись базы данных ``` class Tasks(models.Model): task = models.TextField(max_length=350) date = models.DateField() objects = PublishedManager() def set_random_name_from_list(self): self.task = random.choice(['Memes', 'Do it again', 'Something good', 'awful']) self.save() ``` --- Чтобы вызвать эту функцию, нам нужно напрямую обращаться к элементу базы данных ``` from django_unicorn.components import UnicornView from Pages.models import Tasks class MainPageView(UnicornView): tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] new_task = '' new_date = '' def save(self): new_field = Tasks(task = self.new_task, date = self.new_date) new_field.save() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] self.new_task = '' self.new_date = '' def delete(self, pk): field = Tasks.objects.get(id = pk) field.delete() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] def set_to_default(self): Tasks.objects.get_all_names() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] def set_to_random(self): for i in Tasks.objects.all(): i.set_random_name_from_list() self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()] ``` --- Правки в код шаблона предлагаю внести самостоятельно (буквально одна кнопка)
{"metaMigratedAt":"2023-06-16T19:53:44.246Z","metaMigratedFrom":"Content","title":"Менеджеры моделей","breaks":true,"contributors":"[{\"id\":\"0d39d5a3-691d-488c-8f1e-1a0fb0be4f13\",\"add\":4612,\"del\":0}]"}
    190 views