English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Модели (Model) Django

Модель представляет нашу базу данных таблицы или класс集合, и каждый атрибут класса является полем таблицы или集合а. Модель определена в app/models.py (в нашем примере: myapp/models.py)

Создание модели

Ниже приведен пример создания экземпляра модели Dreamreal −

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
from django.db import models
 class Dreamreal(models.Model):
    website = models.CharField(max_length = 50)
    mail = models.CharField(max_length = 50)
    name = models.CharField(max_length = 50)
    phonenumber = models.IntegerField()
    class Meta:
       db_table = "dreamreal"

Каждая модель наследуется от django.db.models.Model.

У нашего класса есть 4 свойства (3 CharField и 1 целое число), которые будут полями таблицы.

The Meta class and the db_table attribute allow us to define the actual table or collection name. Django will automatically name the table or collection: myapp_modelName. This class will enforce the table name. Django will automatically name the table or collection: myapp_modelName. This class will enforce the table name.

In django.db.models, more field types are available, you can learn more about them at the following URL:

https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

After creating the model, Django needs to generate the actual database -

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
$python manage.py syncdb

Data operations (CRUD)

Let's create a 'crudops' view to see how CRUD operations can be performed on the model. Now myapp/views.py will look like -

myapp/views.py

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def crudops(request):
    #Creating an entry
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    #Read ALL entries
    objects = Dreamreal.objects.all()
    res = 'Printing all Dreamreal entries in the DB: <br>'
    for elt in objects:
       res += elt.name + "<br>"
    #Read a specific entry:
    sorex = Dreamreal.objects.get(name = "sorex")
    res += 'Printing One entry <br>'
    res += sorex.name
    #Delete an entry
    res += '<br> Deleting an entry <br>'
    sorex.delete()
    #Update
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    res += 'Updating entry<br>'
    dreamreal = Dreamreal.objects.get(name = 'sorex')
    dreamreal.name = 'thierry'
    dreamreal.save()
    return HttpResponse(res)

Другие операции с данными

Давайте рассмотрим другие операции, которые можно выполнять с моделями. Следует отметить, что CRUD-операции выполняются над экземплярами модели, и теперь мы напрямую покажем работу модели класса.

Давайте создадим "datamanipulation" вид в myapp/views.py

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def datamanipulation(request):
    res = ''
    #Фильтрация данных:
    qs = Dreamreal.objects.filter(name = "paul")
    res += "Найдено: %s результатов<br>"%len(qs)
    #Сортировка результатов
    qs = Dreamreal.objects.order_by("name")
    for elt in qs:
       res += elt.name + '<br>'
    return HttpResponse(res)

Связь моделей

Django ORM предоставляет 3 способа для связи моделей −

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

myapp/models.py

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
from django.db import models
 class Dreamreal(models.Model):
    website = models.CharField(max_length = 50)
    mail = models.CharField(max_length = 50)
    name = models.CharField(max_length = 50)
    phonenumber = models.IntegerField()
    online = models.ForeignKey('Online', default = 1)
    class Meta:
       db_table = "dreamreal"
 class Online(models.Model):
       domain = models.CharField(max_length = 30)
    class Meta:
       db_table = "online"

Можно обновить myapp/models.py, как вы видите, мы добавили онлайн-режим и свяжем его с моделью Dreamreal.

Давайте посмотрим, как можно выполнить все работы через shell manage.py −

Давайте начнем с тестирования создания нескольких компаний (Dreamreal项) с помощью Django shell −

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
$python manage.py shell
 >>> from myapp.models import Dreamreal, Online
 >>> dr1 = Dreamreal()
 >>> dr1.website = 'company1.com'
 >>> dr1.name = 'company1'
 >>> dr1.mail = 'contact@company1'
 >>> dr1.phonenumber = '12345'
 >>> dr1.save()
 >>> dr2 = Dreamreal()
 >>> dr1.website = 'company2.com'
 >>> dr2.website = 'company2.com'
 >>> dr2.name = 'company2'
 >>> dr2.mail = 'contact@company2'
 >>> dr2.phonenumber = '56789'
 >>> dr2.save()

Теперь есть несколько托管 доменов −

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
>>> on1 = Online()
 >>> on1.company = dr1
 >>> on1.domain = "site1.com"
 >>> on2 = Online()
 >>> on2.company = dr1
 >>> on2.domain = "site2.com"
 >>> on3 = Online()
 >>> on3.domain = "site3.com"
 >>> dr2 = Dreamreal.objects.all()[2]
 >>> on3.company = dr2
 >>> on1.save()
 >>> on2.save()
 >>> on3.save()

Доступ к свойствам托管公司 (Dreamreal项) из онлайн-области очень прост −

 # Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
>>> on1.company.name

Если想知道 все онлайн-домены, которые主办 компания Dreamreal, мы будем использовать код -

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
>>> dr1.online_set.all()

Для получения QuerySet обратите внимание, что все методы операций, которые мы видели ранее (filter, all, exclude, order_by...)

Также можно получить все онлайн-домены, находящиеся в Dreamreal, где имя содержит "company" с помощью фильтрации свойств связанного модели, например, чтобы получить все онлайн-домены, находящиеся в Dreamreal, где имя содержит "company"...

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
>>> Online.objects.filter(company__name__contains='company'...

Примечание - Этот запрос поддерживает только SQL-базы данных. Он не работает с нереляционными базами данных, где отсутствуют связи, и имеет два "_".

Но это не единственный способ создания связи между моделями, также существует OneToOneField, который гарантирует уникальную связь между двумя объектами. Если используется OneToOneField в вышеуказанном примере, это означает, что для каждой записи Dreamreal будет соответствовать только один онлайн-запись.

Последнее, отношения между таблицами ManyToManyField (NN) основаны на реляционной базе данных SQL.