English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Модель представляет нашу базу данных таблицы или класс集合, и каждый атрибут класса является полем таблицы или集合а. Модель определена в 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
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.