You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -12,146 +12,191 @@ QuerySet, по сути, — список объектов заданной Мо
12
12
13
13
Открой свой локальный терминал (не на PythonAnywhere) и набери следующую команду:
14
14
15
-
(myvenv) ~/djangogirls$ python manage.py shell
16
-
15
+
{% filename %}command-line{% endfilename %}
16
+
```
17
+
(myvenv) ~/djangogirls$ python manage.py shell
18
+
```
17
19
18
20
Результат должен быть таким:
19
21
20
-
(InteractiveConsole)
21
-
>>>
22
-
22
+
{% filename %}command-line{% endfilename %}
23
+
```python
24
+
(InteractiveConsole)
25
+
>>>
26
+
```
23
27
24
28
Ты находишься в интерактивной консоли Django. По сути, это та же интерактивная консоль Python, но с магией Django :) Ты можешь использовать весь синтаксис Python, разумеется.
25
29
26
30
### Все объекты
27
31
28
32
Давай попробуем вывести на экран все записи в нашем блоге. Ты можешь сделать это следующей командой:
29
33
30
-
>>> Post.objects.all()
31
-
Traceback (most recent call last):
32
-
File "<console>", line 1, in <module>
33
-
NameError: name 'Post' is not defined
34
-
34
+
{% filename %}command-line{% endfilename %}
35
+
```python
36
+
>>> Post.objects.all()
37
+
Traceback (most recent call last):
38
+
File "<console>", line 1, in<module>
39
+
NameError: name 'Post'isnot defined
40
+
```
35
41
36
42
Упс! Ошибка. Она говорит, что не существует объекта с именем Post. И это верно — мы забыли импортировать его!
37
43
38
-
>>> from blog.models import Post
39
-
44
+
{% filename %}command-line{% endfilename %}
45
+
```python
46
+
>>>from blog.models import Post
47
+
```
40
48
41
49
Всё просто: мы импортируем модель `Post` из `blog.models`. Давай попробуем получить все записи блога ещё раз:
42
50
43
-
>>> Post.objects.all()
44
-
<QuerySet [<Post: my post title>, <Post: another post title>]>
45
-
51
+
{% filename %}command-line{% endfilename %}
52
+
```python
53
+
>>> Post.objects.all()
54
+
<QuerySet [<Post: my post title>, <Post: another post title>]>
55
+
```
46
56
47
-
Это список записей, с которыми мы работали до этого! Мы создали их через панель администратора Django. Теперь же мы хотим создавать записи с помощью Python, так как же мы этого добьемся?
57
+
Это список записей, с которыми мы работали до этого! Мы создали их через панель администратора Django. Теперь же мы хотим создавать записи с помощью Python, так как же мы этого добьёмся?
48
58
49
59
### Создаём объект
50
60
51
61
Создать объект Post в базе данных можно следующим образом:
Но у нас есть один недочёт: `me`. Мы должны передать этой переменной экземпляр модели `User`, который будет отвечать за автора записи. Как это сделать?
57
69
58
-
Давай импортируем модель user для начала:
59
-
60
-
>>> from django.contrib.auth.models import User
70
+
Давай для начала импортируем модель User:
61
71
72
+
{% filename %}command-line{% endfilename %}
73
+
```python
74
+
>>>from django.contrib.auth.models import User
75
+
```
62
76
63
77
Какие пользователи есть в нашей базе данных? Попробуй эту команду:
64
78
65
-
>>> User.objects.all()
66
-
<QuerySet [<User: ola>]>
67
-
79
+
{% filename %}command-line{% endfilename %}
80
+
```python
81
+
>>> User.objects.all()
82
+
<QuerySet [<User: ola>]>
83
+
```
68
84
69
85
Это суперпользователь, которого мы создали ранее! Нам нужен его экземпляр:
70
86
71
-
me = User.objects.get(username='ola')
72
-
87
+
{% filename %}command-line{% endfilename %}
88
+
```python
89
+
>>> me = User.objects.get(username='ola')
90
+
```
73
91
74
92
Как ты можешь заметить, мы получили (`get`) пользователя (`User`) с именем `username` 'ola'. Шикарно! В твоём случае имя, конечно, может отличаться.
<QuerySet [<Post: my post title>, <Post: another post title>, <Post: Sample title>]>
85
-
103
+
{% filename %}command-line{% endfilename %}
104
+
```python
105
+
>>> Post.objects.all()
106
+
<QuerySet [<Post: my post title>, <Post: another post title>, <Post: Sample title>]>
107
+
```
86
108
87
109
Есть, ещё один пост в списке!
88
110
89
111
### Добавляем записи
90
112
91
-
Можешь повеселиться и добавить еще записей. 2-3 будет достаточно.
113
+
Можешь повеселиться и добавить ещё записей. 2-3 будет достаточно.
92
114
93
115
### Фильтрация объектов
94
116
95
-
Важной особенностью QuerySets является возможность фильтровать объекты. Предположим, нам нужно найти все записи пользователя ola. Мы используем метод `filter` вместо метода `all` в `Post.objects.all()`. В кавычках мы укажем условия, по которым будет построена выборка записей. В нашей ситуации условием будет являться равенство поля `author` переменной `me`. В Django мы можем написать это следующим образом: `author=me`. Теперь наш код выглядит следующим образом:
96
-
97
-
>>> Post.objects.filter(author=me)
98
-
<QuerySet [<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]>
117
+
Важной особенностью QuerySets является возможность фильтровать объекты. Предположим, нам нужно найти все записи пользователя ola. Мы используем метод `filter` вместо метода `all` в `Post.objects.all()`. В скобках мы укажем условия, по которым будет построена выборка записей. В нашей ситуации условием будет являться равенство поля `author` переменной `me`. В Django мы можем написать это следующим образом: `author=me`. Теперь наш код выглядит следующим образом:
99
118
119
+
{% filename %}command-line{% endfilename %}
120
+
```python
121
+
>>> Post.objects.filter(author=me)
122
+
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]
123
+
```
100
124
101
125
А может быть мы хотим получить все записи со словом 'title' в поле `title`?
102
126
103
-
>>> Post.objects.filter(title__contains='title')
104
-
<QuerySet [<Post: Sample title>, <Post: 4th title of post>]>
105
-
127
+
{% filename %}command-line{% endfilename %}
128
+
```python
129
+
>>> Post.objects.filter(title__contains='title')
130
+
[<Post: Sample title>, <Post: 4th title of post>]
131
+
```
106
132
107
-
> **Примечание**: Обрати внимание на два символа нижнего подчеркивания (`_`) между `title` и `contains`. Django ORM использует этот синтаксис для разделения имён полей ("title") и операций или фильтров ("contains"). Если ты используешь только один символ нижнего подчеркивания, то получишь ошибку "FieldError: Cannot resolve keyword title_contains".
133
+
> **Примечание**: обрати внимание на два символа нижнего подчёркивания (`_`) между `title` и `contains`. Django ORM использует этот синтаксис для разделения имён полей ("title") и операций или фильтров ("contains"). Если ты используешь только один символ нижнего подчёркивания, то получишь ошибку "FieldError: Cannot resolve keyword title_contains".
108
134
109
135
Ты также можешь получить список всех опубликованных записей. Мы просто отфильтруем записи по полю `published_date`:
К сожалению, пост, который мы добавили в консоли Python, ещё не опубликован. Мы можем изменить это! Сначала выберем запись, которую мы хотим опубликовать:
116
145
117
-
>>> post = Post.objects.get(title="Sample title")
118
-
146
+
{% filename %}command-line{% endfilename %}
147
+
```python
148
+
>>> post = Post.objects.get(title="Sample title")
149
+
```
119
150
120
151
Дальше мы опубликуем её с помощью метода `publish`!
121
152
122
-
>>> post.publish()
123
-
153
+
{% filename %}command-line{% endfilename %}
154
+
```python
155
+
>>> post.publish()
156
+
```
124
157
125
-
Теперь попробуй получить список опубликованных сообщений снова (нажмите стрелку вверх 3 раза и затем `enter`):
158
+
Теперь попробуй получить список опубликованных сообщений снова (нажми стрелку вверх 3 раза и затем `enter`):
0 commit comments