Российский Новый Университет
Опубликован: 25.01.2016 | Доступ: свободный | Студентов: 2252 / 171 | Длительность: 16:40:00
Лекция 4:

Создание аналога Twitter

Собрать все вместе – создание страниц пользователя

Итак, мы осветили кучу материала, такую как введение в концепции представлений и шаблонов. В заключительном разделе мы напишем еще одно представление и сможем использовать информацию, которую мы узнали. Это представление отобразит список всех твитов, принадлежащих пользователю.

Знакомство с моделями Django

Модели – это обычные классы Python с некоторыми дополнительными возможностями. Они являются подклассами django.db.models.Model. За кадром, объектно-реляционное отображение (ORM), связана с этими классами и объектами. Это связывает ее с подлежащей базой данных. ORM одна из важных возможностей Django, без которой мы не смогли бы закончить наши собственные запросы (SQL или MySQL) для доступа к содержимому базы данных. Каждый атрибут модели представляется полем базы данных. Без этих полей, модель будет подобна пустому контейеру, без них она ничего не значит.

Ниже приведено объяснение атрибутов модели Django c отступлением по их использованию. Полный список полей может быть найден на страницах документации: https://docs.djangoproject.com/en/dev/ref/models/fields

Ниже приведен перечень часто используемых типов полей:

Тип поля Описание
IntegerField Целое число.
TextField Поле для большого текста
DateTimeField Поле дата-время
EmailField Поле для электронной почты, максимум 75 символов
URLField Поле для URL-адреса, максимум 200 символов
FileField Поле загружаемого файла

Каждое поле модели принимает набор аргументов конкретного поля. Например если мы хотим,, чтобы поле было типа CharField, мы должны предъявить параметр max_length в качестве его аргумента, который сопоставляется с размером поля в переменной varchar в базе данных.

Ниже приведены аргументы, которые могут быть применены ко всем типам полей (они необязательны):

  • null: по умолчанию он имеет значение false. Когда установлен в true, в связанном поле в базе данных возможно хранить значение null
  • blank: по умолчанию он имеет значение false. Если задано значение true, связанное поле разрешено иметь значение пустое, хранящихся в базе данных.

    Разница между параметрами blank и null связана с тем, что параметр null в основном связан с базой данных, тогда как параметр blank используется для проверки поля. Другими словами, если атрибут установлен в false, пустое значение (blank) для атрибута не будет сохраняться.

  • choices: здесь может быть список или кортеж и он может быть перечисляемым. Если наличествует форма кортежа, первый элемент является значением, которое будет храниться в базе данных,а второе значение используется для отображения в виджетоподобной форме или в ModelChoiceField.

    Например:

    USER_ROLE = (
    
    ('U',’ПОЛЬЗОВАТЕЛЬ’),         
    ('S ',' СОТРУДНИКИ '),	
    ('A', 'АДМИНИСТРАТОР')
    )
    user_role = models.CharField(max_length=l, choice s=USER_ROLE)
    
  • default: значения, назначенные атрибуту, каждый раз, когда создается экземпляр объекта класса.
  • help_text: текстовая помощь, отображаемая в виде виджета.
  • primary_key: Если установлено в True, это поле создает первичный ключ для модели. Если первичный ключ в модели отсутствует, Django создаст целочисленное поле и пометит его как первичный ключ.

Отношения в моделях

Есть три основных типа отношений: многие-ко-многим, многие-к-одному и один-к-одному.

Отношения многие-к-одному

В Django, параметр django.db.models.ForeignKey используется для определения модели как внешнего ключа к атрибуту другой модели, чьи результаты связаны отношениями многие-ко многим.

Этот атрибут используется, как и любой другой в классе модели, после включения класса, в котором он присутствует. Например если учащиеся учаться в конкретной школе, между ними связь такова, что в школе многоо учащихся, каждый учещийся учится только в одной школе, создавая отношения многие-к-одному. Рассмотрим следующий фрагмент кода:

from django.db import models 
class School(models.Model):
#... 
ass
class Student(models.Model):
      school = models.ForeignKey(School)
# ...

Отношения один-к-одному

Отношения один-к-одному очень похожи на отношения многие к одному. Единственное отличие состоит в том, что обратное отображение результатов в одном объекте в случае отношений один к одному противоположно отношениям многие к одному. Например:

class EntryDetail(models.Model):
 entry = models.OneToOneField(Entry)
 details = models.TextField()

В приведенном примере класс EntryDetail() имеет атрибут с именем entry который сопоставлен с моделью Entry отношением один-к-одному. Это означает, что каждый объект модели Entry отображается в модель EntryDetail.

Отношения многие-ко-многим

Как можно предположить по названию, атрибуты модели с отношениями многие-ко-многим обеспечивают доступ к обеим моделям, к которым они прикреплены (как обратная связь один-ко-многим). Именование атрибутов означает только разницу между двумя отношениями.

Чтобы все было ясно, рассмотрим следующий пример:

class Product(models.Model):
name = models.CharField(_(u"Name"), max_length=50) 
class Category(models.Model):
name = models.CharField(_(u"Name"), max_length=50) 
products = models.ManyToManyField("Product", blank=True, null=True)

С идеей атрибута и первичных отношений мы можем сразу создать модель длянашего проекта, чем мы скоро и займемся в следующих разделах.

Если мы соберемся проектировать модель для приложения, мы должны разбить приложения, если в них слишком много моделей. Если у нас есть более чем примерно 15 моделей в приложении, мы должны думать о том, как разбить наше приложение на небольшие приложения. Это связано с тем, что если у нас существует приложение с 15-ю моделями, мы вероятно все усложнили. Это не подходит к философии Django о том, что приложение должно выполнять одну задачу и выполнять ее правильно.

Константин Боталов
Константин Боталов

Вроде легкие вопросы и ответы знаю правильные, но система считает иначе и правильные ответысчитает неправильными. Приходится выполнть по несколько раз. Это я не правильно делаю или тест так составлен?

Владимир Филипенко
Владимир Филипенко

Листинг показывает в 4-ой лекции, что установлен Django 1.8.4. Тут же далее в этой лекции указаны настройки, которые воспринимает Django 1.7 и младше.