what is Djangomodel?
Djangomodel is for datalibrary表 abstraction表示, 它定义了datalibraryin表 structure, 字段class型, relationshipsetc.. DjangousingORM (Object-Relational Mapping) techniques, 允许Development者usingPythonclass来operationdatalibrary, 而不需要writingSQL语句.
提示
Djangomodel遵循DRYprinciples, 一次定义, many 处using. model定义 after , Django可以自动生成datalibrary表, management界面, 表单etc..
creationDjangoapplication
in Djangoin, functions is 组织 in applicationin . 首先需要creation一个application:
python manage.py startapp blog
这会 in projectTable of Contents under creation一个名 for "blog" applicationTable of Contents, package含以 under file:
blog/
├── __init__.py
├── admin.py
├── apps.py
├── migrations/
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
然 after 需要 in project settings.pyfileinregister该application:
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 添加这一行
]
定义model
in application models.pyfilein定义model. 例such as, creation一个BlogPostmodel:
# blog/models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title
常用字段class型
- CharField: stringclass型, 用于store short 文本, 需要指定max_lengthparameter.
- TextField: 文本class型, 用于store long 文本, 不需要指定 long 度.
- IntegerField: 整数class型.
- FloatField: 浮点数class型.
- DecimalField: 十进制 small 数class型, 需要指定max_digits and decimal_placesparameter.
- BooleanField: booleanclass型.
- DateTimeField: 日期时间class型, auto_now_add=True表示creation时自动设置 for 当 before 时间, auto_now=True表示update时自动设置 for 当 before 时间.
- DateField: 日期class型.
- TimeField: 时间class型.
- EmailField: 邮箱class型, 会自动verification邮箱格式.
- URLField: URLclass型, 会自动verificationURL格式.
- ForeignKey: out 键relationships, 用于表示一 for many relationships.
- ManyToManyField: many for many relationships.
- OneToOneField: 一 for 一relationships.
modelrelationships
一 for many relationships
usingForeignKey字段表示一 for many relationships. 例such as, 一个作者可以写 many 篇博客:
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
on_deleteparameter指定了当关联 object被delete时 behavior:
- CASCADE: 级联delete, 当关联object被delete时, 关联 object也会被delete.
- PROTECT: 保护, 当关联object被delete时, 抛出ProtectedErrorexception.
- SET_NULL: 设置 for null, 当关联object被delete时, 关联字段设置 for null (需要设置null=True) .
- SET_DEFAULT: 设置 for 默认值, 当关联object被delete时, 关联字段设置 for 默认值 (需要设置defaultparameter) .
- SET(): 设置 for 指定值, 当关联object被delete时, 关联字段设置 for SET()in 值.
- DO_NOTHING: 不做任何operation, 当关联object被delete时, 关联字段保持不变 (可能会导致datalibraryintegrityissues) .
many for many relationships
usingManyToManyField字段表示 many for many relationships. 例such as, 一篇博客可以 has many 个tag, 一个tag可以 for 应 many 篇博客:
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.title
一 for 一relationships
usingOneToOneField字段表示一 for 一relationships. 例such as, 一个user只 has 一个个人资料:
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField()
avatar = models.ImageField(upload_to='avatars/')
def __str__(self):
return f"{self.user.username}'s profile"
datalibrarymigration
定义model after , 需要生成datalibrarymigrationfile, 然 after 执行migration来creationdatalibrary表:
生成migrationfile
python manage.py makemigrations
这会 in application migrationsTable of Contents under 生成migrationfile, 例such as:
blog/migrations/0001_initial.py
执行migration
python manage.py migrate
这会将migrationapplication to datalibrary, creation相应 表structure.
warning
in modifymodel after , 必须重 new 生成migrationfile并执行migration, 否则datalibrary表structure不会update.
model CRUDoperation
可以usingDjango ORM API for modelforCRUD (creation, 读取, update, delete) operation.
creationobject
# method1
post = BlogPost(title="Hello Django", content="This is my first Django blog post.")
post.save()
# method2
post = BlogPost.objects.create(title="Hello Django", content="This is my first Django blog post.")
queryobject
# 获取所 has object
posts = BlogPost.objects.all()
# 根据条件query (get返回单个object, 不存 in or many 个时抛出exception)
post = BlogPost.objects.get(id=1)
post = BlogPost.objects.get(title="Hello Django")
# 根据条件filter (filter返回QuerySet)
posts = BlogPost.objects.filter(is_published=True)
posts = BlogPost.objects.filter(title__contains="Django") # 标题package含"Django"
posts = BlogPost.objects.filter(title__startswith="Hello") # 标题以"Hello"开头
posts = BlogPost.objects.filter(pub_date__year=2023) # release年份 for 2023
# sort
posts = BlogPost.objects.order_by('pub_date') # 升序
posts = BlogPost.objects.order_by('-pub_date') # 降序
# 切片 (获取 before 5个object)
posts = BlogPost.objects.all()[:5]
updateobject
# method1
post = BlogPost.objects.get(id=1)
post.title = "Updated Title"
post.save()
# method2 (批量update)
BlogPost.objects.filter(is_published=False).update(is_published=True)
deleteobject
# delete单个object
post = BlogPost.objects.get(id=1)
post.delete()
# 批量delete
BlogPost.objects.filter(is_published=False).delete()
练习 1: creationmodel并执行migration
- creation一个名 for "store" Djangoapplication.
- in storeapplicationin定义Productmodel, package含name (CharField) , price (DecimalField) , description (TextField) , created_at (DateTimeField) , is_available (BooleanField) 字段.
- in settings.pyinregisterstoreapplication.
- 生成migrationfile.
- 执行migration.
- usingDjango shellcreation几个Productobject.
练习 2: 定义modelrelationships
- in storeapplicationin定义Categorymodel, package含name (CharField) 字段.
- in Productmodelin添加category字段, and Categorymodel建立一 for many relationships.
- 生成migrationfile并执行migration.
- usingDjango shellcreation几个Categoryobject and 关联 Productobject.