Djangomodel and datalibrary

LearningDjango ORMmodel定义, 字段class型, migration and CRUDoperation

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

  1. creation一个名 for "store" Djangoapplication.
  2. in storeapplicationin定义Productmodel, package含name (CharField) , price (DecimalField) , description (TextField) , created_at (DateTimeField) , is_available (BooleanField) 字段.
  3. in settings.pyinregisterstoreapplication.
  4. 生成migrationfile.
  5. 执行migration.
  6. usingDjango shellcreation几个Productobject.

练习 2: 定义modelrelationships

  1. in storeapplicationin定义Categorymodel, package含name (CharField) 字段.
  2. in Productmodelin添加category字段, and Categorymodel建立一 for many relationships.
  3. 生成migrationfile并执行migration.
  4. usingDjango shellcreation几个Categoryobject and 关联 Productobject.