owned this note
owned this note
Published
Linked with GitHub
# Менеджеры моделей
---
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()]
```
---
Правки в код шаблона предлагаю внести самостоятельно (буквально одна кнопка)