首页 > Python基础教程 >
-
Django中数据库操作
一、数据库中时间类型
1.三种时间类型:DateTimeField、DataField、TimeField三种类型;在使用之前需先导入import django.utils.timezone包
2.该三种类型分别对应这Datetime、Data、Time三种对象;
3.时间类型,三个属性,auto_now_add、auto_now、default;这三种不能同时存在;auto_now_add在数据生成时,填入当前时间;
auto_now在数据时更新时,时间更新;default=timezone.now默认当前时间;
BOOK | |||||
---|---|---|---|---|---|
id | title | price | publisher(ForeignKey) | ||
Publisher | |||||
id | name | addr | |||
Author | |||||
id | name | sex | birthday | book(m2m) |
author_book | ||||
---|---|---|---|---|
id | author_id | book_id |
二、字段参数
1.字段参数:
null:表示字段是否可以为空;
unique:表示字段是否唯一;
db_index:给字段设置索引;
default:给字段设置默认值;
2.时间字段独有的参数
auto_now_add:生成数据时生成数据;
auto_now:每次更新数据时更新数据;
3.关系字段参数
to:要关联的表
to_field:要设置关联的字段,一般不用设置,默认情况下为关联另一张表里面的主键;
related_name:代替反向操作的 '表名_set'
反向操作时,
例如:未设置该参数情况下,Publisher.objects.get(id=1).book_set.all()
设置了related_name='stu'(BOOK表里面);Publisher.objects.get(id=1).stu.all()
related_query_name:对反向操作的queryset时,用来'表名_set'指定里面的 '表名'
db_constraint:取消外键约束,默认为开启约束True;2.0版本以后需要显示的声明;
on_delete:对级联操作的一些设定:(针对ForgineKey/onetoone特有),db_constraint=False;
models.CASCADE:删除关联数据,与之相关联的数据也一并删除;
models.NOTHING:删除关联数据,引发IntegrityError;
models.PROTECT:删除关联数据,报错ProtectedError;
models.SET_NULL:删除关联数据, 与之关联的数据改为null;×为测通 报改变表结构
models.SET_DEFAULT:删除关联数据, 与之关联数据改为默认值(前提外键设置默认值);
models.SET:删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
4.manytomany关系
manytomany表的关系维护是通过第三张表author_book来维护的;
manytomany关系涉及三张表:author表、book表、author_book表;
三张表的关系建立(主要针对第三张表author_book)三种形式:(第三张表怎么创建[手动/自动],关联关系怎么创建[手动/自动])
方法一:Manytomany正常指定;
方法二:自己指定第三张表,通过ForeginKey来指定;自动创建关联关系
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")
方法三:自己指定第三张表,并通过 manytomany指定关联:手动创建关联关系;
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
# through_fields接受一个2元组('field1','field2'):
# 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")