Django---ORM总结

来源:互联网 发布:安祖赛弗的数据1 编辑:程序博客网 时间:2024/05/21 19:47

model(数据库操作)

1 django默认支持sqlite,mysql, oracle,postgresql数据库。

** <1> sqlite**        django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3 <2> mysql        引擎名称:django.db.backends.mysql

2 mysql驱动程序

  • MySQLdb(mysql python)
  • mysqlclient
  • MySQL
  • PyMySQL(纯python的mysql驱动程序)

3 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }}DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',         'NAME': 'books',    #你的数据库名称        'USER': 'root',   #你的数据库用户名        'PASSWORD': '', #你的数据库密码        'HOST': '', #你的数据库主机,留空默认为localhost        'PORT': '3306', #你的数据库端口    }

orm(对象关系映射)

orm 就是说 python中的模型(类) 映射 到原生的sql语句

.query 方法查询orm对应的sql语句

 print(models.Purte.objects.filter(book__title__startswith='d').values('name').query)

单表

save方法

#save方式添加user_message = UserInfo()    user_message.username = 'lisi'    user_message.age=18    user_message.user_type=1    user_message.save()

create方法

#字典方式添加dic = {'username':'mosson','age':18,'user_type_id':1}models.UserInfo.objects.create(**dic)#先获取组的对象usertype = models.UserType.objects.fiter(id=2)#添加的时候直接添加对象就可以models.UserInfo.objects.create(username='seven',age=18,user_type=usertype)#写成一行也行models.UserInfo.objects.create(username='lile',age=18,user_type=models.UserType.objects.filter(id=1))

models.UserInfo.object.filter(id=1).delete()

update

models.UserInfo.objects.filter(id__gt=0).update(username='admin')

save

user = models.UserInfo.objects.get(id=2)    user.username='root3'    user.save()    user = models.UserInfo.objects.filter(id=1)[0]    user.username='root2'    user.save()

注意

update 是QuerySet对象的方法

models.UserInfo.objects.all() #返回一个QuerySet集合对象models.UserInfo.objects.filter()#返回一个QuerySet集合对象models.UserInfo.objects.get()#返回一个行对象user = models.UserInfo.objects.filter(id=1).values('username') #等同于‘select username form UserInfo’返回<QuerySet [{'user': 'admin'}]>user = models.UserInfo.objects.all().order_by('id')#根据id排序models.UserInfo.objects.all().order_by('-id')#根据id逆向排序user = models.UserInfo.objects.values('username').distinct()# 去重

一对一(oneToOne)

就是在一对多的基础上 将多的那一个设置唯一:author=True

一对多(Foreignkey)

Object Relational Mapping(关系对象映射)

class UserType(models.Model):    caption = models.CharField(max_length=32)class UserInfo(models.Model):    username = models.CharField(max_length=32)    age = models.IntegerField()    user_type = models.Foreignkey('UserType')#外键

正向查找:ForeignKey在UserInfo表中,如果从UserInfo表开始想其他表查询,这个就是正向查找,反之就是反向查找

create

#方式一models.UserInfo.objects.create(username='lisi',age=18,user_type_id=1)#方式二models.UserInfo.objects.create(username='lisi',age=18,user_type=obj)

多对多(ManyToMany)

系统生产成第三张表

class Book(models.Model):    title = models.CharField(max_length=64)    price = models.IntegerField()    color = models.CharField(max_length=64)    page_nub = models.IntegerField()    author = models.ManyToManyField('Author')    def __str__(self):        return self.titleclass Author(models.Model):    name = models.CharField(max_length=64)    def __str__(self):        return self.name

绑定add

正向查找

    author1 = models.Author.objects.get(id=1)    author2 = models.Author.objects.get(id=2)    books = models.Book.objects.get(id=1)    books.author.add(author1,author2)

反向查找

author = models.Author.objects.get(id=1)books = models.Book.objects.get(id__gt=1)author.book_set。add(*books)

移除remove

    author1 = models.Author.objects.get(id=1)    author2 = models.Author.objects.get(id=2)    books = models.Book.objects.get(id=1)    books.author.remove(author1,author2)

自定义第三张表

class Book(models.Model):    title = models.CharField(max_length=64)    price = models.IntegerField()    color = models.CharField(max_length=64)    page_nub = models.IntegerField()    # author = models.ManyToManyField('Author')    def __str__(self):        return self.titleclass Author(models.Model):    name = models.CharField(max_length=64)    def __str__(self):        return self.nameclass Boot2Author(models.Model):    book = models.ForeignKey(to='Book')    author = models.ForeignKey(to='Author')    class Meta:        unique_together=['book','author']

    author1 = models.Author.objects.get(id=1)    books = models.Book.objects.get(id=1)    models.Boot2Author.objects.create(book=books,author=author1)

删——级联删除

models.Book.objects.filter(id=1).delete()这时Book表中id等于1的行被删掉并且,Book2Author表中含有Book_id = 1的行也会被删掉

了不起的双下划线

单表查询

id__gt 大于1models.Book.objects.filter(id__gt=1):id__lt 小于3models.Book.objects.filter(id__lt=3):id__in id在[1,2,3]中的行查询到   在某个范围models.Book.objects.filter(id__in=[1,2,3]):__contatins 包含某些字段models.Book.objects.filter(title__contains='c'):__icontatins 不区分大小写models.Book.objects.filter(title__icontains='c'):__startswith 以什么开头models.Book.objects.filter(title__startswith='d')

关联查询

models.Purte.objects.filter(book__title__startswith='d').values('name')自定义表的多对多关联查询models.Author.objects.filter(id__gt=1).values('boot2author__book__title')

聚合查询和分组查询

aggregate(*args,**kwagrs)

通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中返回值。即在查询集合上生成聚合

from django.db.models import Avg,Min,Sum,Maxa = models.Book.objects.all().aggregate(Avg('price')) #求平均值print(a)b = models.Book.objects.all().aggregate(Min('price')) #求最小值print(b)c = models.Book.objects.all().aggregate(Sum('price')) #求和print(c)d = models.Book.objects.all().aggregate(Max('price')) #求最大值print(d)

annotate

可以通过计算查询结果中的每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合

a = models.Book.objects.values('puter__name').annotate(Sum('price'))#根据puter表中的name字段分组 并计算price的和print(a)

F查询和Q查询

F查询

from django.db.models import F#将Book表中的price列的值加 10models.Book.objects.all().update(price=F("price")+10)

Q查询

#在Book表中查询id=2 或 title='C'的数据models.Book.objects.filter(Q(id=2) | Q(title='C'))#在Book表中查询id大于2 并且 color='as'的数据models.Book.objects.filter(Q(id__gt=2)&(Q(color='as')))#同时也支持嵌套使用models.Book.objects.filter(Q(id__gt=2)&(Q(color='as') | Q(title='C')))#~代表非models.Book.objects.filter( ~Q(color='as'))

admin

python manage.py createsuperuser

汉化

settings 设置LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'

models.py

verbose_name='' #在admin页面显示的列名editable=False 该数据不可更改

admin.py

list_display('title','price')#在admin页面显示的的列search_fields=('title',) # 添加一个搜索框 根据'title'进行搜索list_fields('title',) #添加一个过滤器 ,根据'title'进行过滤