Django Orm 常用字段和参数
ORM 对象关系映射
Django中的orm
第一步:先在Django项目的settings.py文件中,配置数据库连接信息
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "你的数据库名称", # 需要自己手动创建数据库 "USER": "数据库用户名", "PASSWORD": "数据库密码", "HOST": "数据库IP", "POST": 3306 } }
第二步:在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块链接的数据库
import pymysql
pymysql.install_as_MySQLdb()
model
说明:
1.表名是自动生成的,如果要自定义表名:
class Author(models.Model): name=models.CharField(max_length=32) books=models.ManyToManyField(to='Book',db_table='author2book')#多对多建立关系时生成第三张表自定义表名 class Meta: db_table = 'author'#自定义表名
2.id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定primary_key=True即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动id列。
3.Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句
4.Django支持MySQL5.5及更高版本
Django ORM一般操作
all()查询所有结果
ret=models.Book.objects.all()
print(ret)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎样练成的>, <Book: 番茄的十种做法>]>
filter(**kwargs)它包含了与所给筛选条件相匹配的对象
ret=models.Publisher.objects.filter(id=1) print(ret)#<QuerySet [<Publisher: 我是垃圾出版社>]>
get(**kwargs)返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有就会抛出错误
ret = models.Publisher.objects.get(id=1) print(ret)#我是垃圾出版社 ret = models.Publisher.objects.get(name='我是垃圾出版社') print(ret)#app01.models.MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2!
exclude(**kwargs)它包含了与所给筛选条件不匹配的对象
ret = models.Publisher.objects.exclude(id=1) print(ret)#<QuerySet [<Publisher: 超神出版社>]>
values(*field)返回一个ValueQuerySet一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
ret = models.Publisher.objects.values() print(ret)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'}, {'id': 2, 'name': '超神出版社', 'city': '北京'}]> print(ret[0])#{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'} print(ret[0]['name'])#我是垃圾出版社 ret1 = models.Publisher.objects.values('id','name') print(ret1)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社'}, {'id': 2, 'name': '超神出版社'}]>
values_list(*field)它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
ret = models.Publisher.objects.values_list() print(ret)#<QuerySet [(1, '我是垃圾出版社', '上海'), (2, '超神出版社', '北京')]> print(ret[0])#(1, '我是垃圾出版社', '上海') print(ret[0][1])#我是垃圾出版社 ret1 = models.Publisher.objects.values_list('id','name') print(ret1)#<QuerySet [(1, '我是垃圾出版社'), (2, '超神出版社')]>
order_by(*field)对查询结果排序
from app01 import models ret = models.Book.objects.order_by('title') print(ret)#<QuerySet [<Book: 我是小三>, <Book: 未成年心理学>, <Book: 渣男是怎样练成的>, <Book: 番茄的十种做法>]> ret1 = models.Book.objects.order_by('price') print(ret1)#<QuerySet [<Book: 番茄的十种做法>, <Book: 未成年心理学>, <Book: 渣男是怎样练成的>, <Book: 我是小三>]>默认升序
reverse()对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)
from app01 import models ret = models.Book.objects.order_by('title').reverse() print(ret)#<QuerySet [<Book: 番茄的十种做法>, <Book: 渣男是怎样练成的>, <Book: 未成年心理学>, <Book: 我是小三>]> ret1 = models.Book.objects.order_by('price').reverse() print(ret1)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎样练成的>, <Book: 未成年心理学>, <Book: 番茄的十种做法>]>
distinct()去重
ret4 = models.Book.objects.filter(Q(author__name='西方不败')|Q(author__name='垃圾东瀛')).distinct() print(ret4)
count()返回数据库中匹配查询(QuerySet)的对象数量
from app01 import models ret = models.Book.objects.filter(title__icontains='是').count() print(ret)#2
first()返回第一条记录
from app01 import models ret = models.Book.objects.first() print(ret)#我是小三
last()返回最后一条记录
from app01 import models ret = models.Book.objects.last() print(ret)#未成年心理学
exists()如果QuerySet包含数据,就返回True,否则返回Flase
from app01 import models ret = models.Author.objects.exists() print(ret)#True
Django ORM 常用字段和参数
常用字段
AutoField
int自增列,必须填入参数primary_key=True。如果没有自增列会自动生成一个id自增列
from django.db import models class User(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max_length=16) class Publisher(models.Model):
#没有自增列 会自动增加id自增列 name = models.CharField(max_length=32)
IntegerField
一个整数类型,-2147483648 to 2147483647
因为整数类型只有十位所以手机号 证件号之类的都不可以用它来存
CharField
字符类型,必须提供max_length参数,max_length表示字符长度
class Author(models.Model): name = models.CharField(max_length=32)
字符类型相当于数据库里的varchar类型
我们可以自定义一个char
class zhangxiangyucharField(models.Field): def __init__(self,max_length,*args,**kwargs): self.max_length=max_length super().__init__(max_length=max_length,*args,**kwargs) def db_type(self,connection): return 'char(%s)'%self.max_length
DateField
日期字段,日期格式 YYYY-MM-DD,相当于python中的datetime.date()实例
class Book(models.Model): title = models.CharField(max_length=32) publish_date = models.DateField(auto_now_add=True)
#auto_now_add添加值的时候时间就固定了,而auto_now每次改变值的时候都会更新一次时间
DateTimeField
日期时间字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于python中的datetime.datetime()实例
字段合集(争取记忆)
https://www.cnblogs.com/liwenzhou/p/8688919.html
orm字段和数据库实际字段的对应关系
字段参数
null
用于表示某个字段可以为空
class Publisher(models.Model): name=models.CharField(max_length=32,null=True)
unique
如果设置为unique=True 则该字段在此表中必须是唯一的
class Publisher(models.Model): name=models.CharField(max_length=32,unique=True)
db_index
如果db_index=True则代表着为此字段设置索引
defaul
为该字段设置默认值
class Publisher(models.Model): name=models.CharField(max_length=32,default='张相玉帅哥')
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在'一对多'中'多'的一方
ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系
to
设置要关联的表
to_field
设置要关联的表的字段
related_name
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
related_query_name
反向查询操作时,使用的连接前缀,用于替换表名
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) publish_date = models.DateField(auto_now_add=True) price = models.DecimalField(max_digits=5, decimal_places=2) # 创建外键,关联publish publisher = models.ForeignKey(to="Publisher" ,related_name='books',related_query_name='zhangshuaige') # 创建多对多关联author author = models.ManyToManyField(to="Author") def __str__(self): return self.title
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xianzai.settings") import django django.setup() from app01 import models publisher_obj=models.Publisher.objects.first() 如果设置了related_name='books' ret=publisher_obj.books.all() print(ret[0]) #如果设置了 related_query_name='zhangshuaige' ret=models.Publisher.objects.filter(id=1).values('zhangshuaige__title') print(ret)
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为
OneToOneField
一对一字段
通常一对一字段用来扩展已有字段。
to 设置要关联的表
to_field 设置要关联的字段
on_delete
ManyToManyField
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系
to related_name related_query_name 同ForeignKey字段
through
设置第三张表的表名
class Author(models.Model): name=models.CharField(max_length=32) books=models.ManyToManyField( to='Book', through='Book2Author', through_fields=('author','book') )
through_fields
设置关联的字段
db_table
默认创建第三张表时,数据库中表的名称