Django模型

时间:2020-02-23 14:33:06  来源:igfitidea点击:

在本教程中,我们将详细介绍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模型创建测试数据。

我们创建单个模型集并将其合并到教室中。
在查询教师模型时,由于"通过",学生会自动更新。