Django模型
在本教程中,我们将详细介绍Django模型。
在此之前,让我们从终端快速设置我们的Django项目。
一一执行以下命令:
mkdir theitroadDjangoModels cd theitroadDjangoModels virtualenv -p /usr/local/bin/python3 env source env/bin/activate pip3 install django django-admin startproject DjangoModel
python3 manage.py runserver django-admin startapp school
创建学校应用后,我们需要将其添加到" settings.py"内的" INSTALLED_APPS"中
记下在学校应用中创建的models.py文件。
这将是本教程中最想要的文件。
让我们开始吧。
Django模型
数据库是任何Web应用程序的重要组成部分。
Django模型是数据信息的来源。
您可以其中以字段形式存储值。
每个Django模型都将保存在数据库中,而Django模型中定义的字段是数据库字段。
Django模型也用于在后台执行SQL代码。
让我们在models.py文件中创建第一个Django模型。
Django模型范例
以下是来自models.py文件的代码:
from django.db import models # Create your models here. class Student(models.Model): name = models.CharField(max_length=30) age = models.IntegerField() email = models.EmailField() website = models.URLField()
学生是具有四个字段的Django模型。
Django模型字段
Django模型可以具有以下任何类型的字段:CharField,IntegerField,EmailField,URLField,DateField,BooleanField,AutoField,UUIDField,OneToOneField,ManyToOneField。
如何设置主键?
id = models.AutoField( primary_key=True, )
列位选项
" max_length" –设置允许的最大字符数
verbose_name-字段的可读名称
full_name = models.CharField(verbose_name='full name', max_length=100)
null
–将null设置为True允许我们将该列保留为空白。
然后,该列将存储NULL作为值。
例:
age = IntegerField(null=True)
blank
–同样,如果blank = True,则允许该字段为空白。
空白用于表单验证,我们可以其中指定是否必须输入字段。
choices
-这就像一个2元组,用于从值列表中选择。
from django.db import models # Create your models here. class Student(models.Model): SECTION = ( ('A', 'Alpha'), ('B', 'Beta'), ('C', 'Cappa'), ) name = models.CharField(max_length=30) age = models.IntegerField() email = models.EmailField() website = models.URLField() section = models.CharField(max_length=1, choices=SECTION, default=SECTION[1][0])
选项中必须使用"默认"字段选项,除非放置"空"或者"空白"选项。
如何将此模型添加到数据库?
python3 manage.py makemigrations school
上面的命令创建模型。
这是终端的输出:
让我们打开views.py文件并创建基本的Django模型,然后将其打印在屏幕上。
from django.shortcuts import render from school.models import Student from django.http import HttpResponse # Create your views here. def home(request): #Creating an entry objects = Student.objects.all().delete() student = Student(name = "Anupam", email = "[email protected]",age = "24", website = "www.theitroad.local",section="A") student.save() student = Student(name = "Another", email = "[email protected]",age = "21", website = "www.google.com") student.save() objects = Student.objects.all() res ='Printing all Students entries in the DB : <br>' for elt in objects: res += "Name: "+elt.name+"<br>" res += "Age: "+str(elt.age)+"<br>" res += "Section: "+elt.section+"<br>" res += "Section Full Name: "+elt.get_section_display()+"<br>" return HttpResponse(res)
save()方法将模型添加到数据库中。
每次加载此页面时,都会附加新模型。
因此,在开始时,我们"删除()"所有模型。
对于选择,要显示右侧部分,我们使用自动生成的方法get_section_display()
。
缩进很重要!
是时候在urls.py
文件中进行URL路由了。
现在运行以下两个命令:
python3 manage.py migrate python3 manage.py runserver
CRUD操作
创建Django模型新实例的另一种方法:
anupam = Student.objects.create(name = "Anupam", email = "[email protected]",age = "24", website = "www.theitroad.local",section="A")
除了创建,删除,检索我们到目前为止已实现的内容外,我们还可以使用过滤器搜索数据。
from school.models import Student from django.http import HttpResponse def randomFunctionFilter(request): res = '' object = Student.objects.filter(name = "Anupam") res += "Found : %s students<br>"%len(object) obj = Student.objects.order_by("age") for elt in obj: res += elt.name + '<br>' return HttpResponse(res)
如何过滤大于和小于?
object = Student.objects.filter(age__lt 10) object = Student.objects.filter(age__gt 20)
更新数据
student = Student.objects.get(name='Anupam') student.age = 100 student.save()
student = Student.objects.get(name='Anupam') student.delete()
元类是我们可以在Django模型中定义的内部类。
我们可以指定Django Model类的verbose_name以及默认的排序字段名称,数据库表名称等。
from django.db import models class Me(models.Model): size = models.IntegerField() class Meta: ordering = ["-size"] verbose_name = "m" verbose_name_plural = "meee" db_table = "Mytable"
`ordering = [" -size"]"降序排列
有关功能的完整列表,请参见此处
外键
让我们创建一个新的Django模型并添加外键
class Teacher(models.Model): name = models.CharField(max_length=100) students = models.ManyToManyField(Student) user = models.ForeignKey('auth.User', on_delete=models.CASCADE) def __str__(self): return self.name
str方法定义了模型的人类可读表示,该模型显示在Django管理站点和Django Shell中。
外键链接到另一个类。
这次是django内置类。
on_delete字段选项指示删除模型时的操作。
CASCADE:删除引用的对象后,还请删除对其具有引用的对象(例如,删除教程 文章时,您可能还希望删除注释)。
保护:禁止删除引用的对象。
要删除它,您将必须删除所有手动引用它的对象。SET_NULL:将引用设置为NULL(要求该字段可为空)。
例如,当删除用户时,您可能希望保留他在教程 文章中发布的注释,但说该注释是由匿名(或者已删除)用户发布的。SET_DEFAULT:设置默认值。
通过
通过用于通过中介类连接两个表。
让我们通过一个示例用例来了解这一点。
以下是我们的models.py类:
from django.db import models # Create your models here. class Student(models.Model): name = models.CharField(max_length=30) class Teacher(models.Model): name = models.CharField(max_length=100) members = models.ManyToManyField(Student, through='Classroom') class Classroom(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE) teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE) date_joined = models.DateField()
保存文件,然后在终端中运行以下命令:
python3 manage.py makemigrations school python3 manage.py migrate python3 manage.py shell
这将打开一个交互式shell,我们可以其中为上述Django模型创建测试数据。
我们创建单个模型集并将其合并到教室中。
在查询教师模型时,由于"通过",学生会自动更新。