django_ORM

数据表的创建:

       python manage.py makemigrations

       python manage.py migrate

后台管理注册:

      admin.site.register()

创建超级用户:

      python manage.py createsuperuser

>>>models创建基本
class Book(models.Model):
    name=models.CharField(max_length=20)
    price=models.IntegerField()
    p_date=models.DateField()
    author=models.CharField(max_length=32,null=False)

class Author(models.Model):
    name=models.CharField(max_length=32)

增删改查操作

增
方法一:
b=Book(name="python",price=99,author="yuan",p_date="2017-12-12")
b.save();
方法二:
Book.objects.create(name="老男孩",price=99,author="yuan",p_date="2017-12-12")        #推荐************
删
Book.objects.filter(author="alex").delete()
改
方法一:
Book.objects.filter(author="yuan").updat(price=109)   #推荐************
方法二:
b=Book.objects.get(author="alex")
b.price=120
b.save()
查
Book.objects.filter(id=2) #拿到id=2的结果
Book.objects.filter(id=2).values("name","price")  #拿到一个列表 内部是一个个字典
Book.objects.filter(id=2).values_list("name","price")    #拿到一个列表 内部是一个个元祖
Book.objects.get(id=2) #只能取到一条记录才不会报错
Book.objects.first() #拿到第一条结果
Book.objects.last() #拿到最后一条结果
Book.objects.all() #拿到所有结果
Book.objects.all()[::2] #步长为2
Book.objects.exclude(id=2) #拿到除id=2数据以外的结果
Book.objects.all().values("name").dictinct()    #去除name字段重复的结果
Book.objects.all().values("name").dictinct().count()    #去除name字段重复的结果之后的数条数  
##支持切片操作
Book.objects.all()[::-1] #拿到所有结果倒叙
Book.objects.all()[::2] #步长为2

#模糊查询
Book.objects.all(price__gt=50).values()      #查询price>50的数据
Book.objects.filter(price__gt=50).values()    
Book.objects.filter(name__contains="p").values()      #查询name字段中含有p的    icontains="p"(不区分大小写)   
__gt(>)
__gte(>=)
__lt(<)
__lte(<=)
__exact(=)

一对多(ForeignKey):外键建立在多的一方


views

     #反向查询
方法三:

ret = Book.objects.filter(publish__name="宁波出版社").values()
print(ret)                                                   #正向查询
#python这本书出版社的名字
方法一:
ret = Book.objects.filter(name="python").values("publish__name") #通过book查找
print(ret)

方法二:
ret = Publish.objects.filter(book__name="python").values("name") #通过publish查找
print(ret)

通过外键渲染到模板

>>>models

class Student(models.Model):
    student_id = models.IntegerField()
    student_name = models.CharField(max_length=10)
    student_sex = models.CharField(max_length=5)
    student_boss = models.ForeignKey('Teacher',on_delete=models.CASCADE)

class Teacher(models.Model):
    teacher_name = models.CharField(max_length=5)

>>>views

def demo(request):
    student_list = Student.objects.all()
    return render(request,'demo.html',locals())

>>>html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% for item in student_list %}
        <p>{{ item.student_boss.teacher_name }}</p>
    {% endfor %}
</body>
</html>

多对多(ManyToManyField):

书籍对象的关联作者 obj=book_obj.author.all()
绑定多对多的关系 obj=add()
          obj.remove(author_obj)

聚合函数使用

from django.db.models import Avg,Min,Sum,Max   #需要导入views

ret = Book.objects.all().aggregate(Min("price"))      #聚合函数的使用
print(ret)

ret = Book.objects.filter(author__name="作者1").aggregate(Sum("price"))  #过滤信息后查询
print(ret)

# F 和 Q 使用查询条件的值,专门取对象中某列值的操作

# from django.db.models import F
# models.Tb1.objects.update(num=F('num')+1)

# Q 构建搜索条件
    from django.db.models import Q

    #1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
    q1=models.Book.objects.filter(Q(title__startswith='P')).all()
    print(q1)#[<Book: Python>, <Book: Perl>]

    # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
    Q(title__startswith='P') | Q(title__startswith='J')

    # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
    Q(title__startswith='P') | ~Q(pub_date__year=2005)


原文地址:https://www.cnblogs.com/yzcstart/p/10644957.html