第7节-----Django模型使用二

一.常用查询

1.常用查询方法如下

mo_xin/urls.py

from mo_xin.models import User

from django.http import HttpResponse


def search_ways(request):
    # 获取所有的数据
    rs = User.objects.all()
    print(rs)
    # 获取第一条数据
    rs = User.objects.first()
    print(rs)
    # 获取最后一条数据
    rs = User.objects.last()
    print(rs)
    # 获取过滤器过滤后的数据,返回QuerySet
    rs = User.objects.filter(age=2020)
    print(rs)
    # 获取除(给的参数)外的数据exclude
    rs = User.objects.exclude(age=2020)
    print(rs)
    # 获取一个数据,若获取的有多个则会报错
    rs = User.objects.get(name='我爱中国22')
    print(rs)
    # 对查询结果排序,单项排序
    rs = User.objects.all().order_by('age')
    print(rs)
    # 对获取的结果多项排序
    rs = User.objects.all().order_by('age','u_id')
    print(rs)
    # 对获取的结果反向排序
    rs = User.objects.all().order_by('-age')
    print(rs)
    # 将查询获取的QuerySet结果转化为字典
    rs = User.objects.all().values()
    print(rs)
    # 统计获取的数据总数
    rs = User.objects.all().count()
    print(rs)
    return HttpResponse("常用查询方法就这些")

mo_xin/urls.py

from django.urls import path
from mo_xin import views
urlpatterns = [

    path('index5/', views.search_ways),


]

数据库中表的值

运行结果

2.常用的查询条件

mo_xin/urls.py

from django.urls import path
from mo_xin import views
urlpatterns = [

    path('index6/', views.search_condition),


]

mo_xin/views.py

from mo_xin.models import User

from django.http import HttpResponse


def search_condition(request):
    # exact 相当于等于(不能忽略大小写)
    rs = User.objects.filter(name__exact='i love china 1')
    print('exact 相当于等于(不能忽略大小写)', rs)

    # iexact 相当于等于(忽略大小写)
    rs = User.objects.filter(name__iexact='i love china 1')
    print('exact 相当于等于(忽略大小写)', rs)

    # contains 包含(不能忽略大小写)
    rs = User.objects.filter(name__contains='i love ')
    print('contains 包含(不能忽略大小写)', rs)

    # i contains 包含(忽略大小写)
    rs = User.objects.filter(name__icontains='i love ')
    print('contains 包含(忽略大小写)', rs)

    # start with 以什么开始
    rs = User.objects.filter(name__startswith='I')
    print(' start with  以什么开始(不能忽略大小写)', rs)

    # i start with 以什么开始
    rs = User.objects.filter(name__istartswith='I')
    print(' i start with  以什么开始(忽略大小写)', rs)

    # end with以什么结尾
    rs = User.objects.filter(name__endswith='1')
    print('end with 以什么结尾(不能忽略大小写)', rs)

    # i end with以什么结尾
    rs = User.objects.filter(name__iendswith='1')
    print('i end with 以什么结尾(忽略大小写)', rs)

    # gt 大于
    rs = User.objects.filter(age__gt=1995)
    print('gt大于', rs)

    # gte 大于等于
    rs = User.objects.filter(age__gte=1995)
    print('gt大于等于', rs)

    # lt 小于
    rs = User.objects.filter(age__lt=1995)
    print('lt小于', rs)

    # lte 小于等于
    rs = User.objects.filter(age__lte=1995)
    print('lte小于等于', rs)

    #  in 在什么中的
    rs = User.objects.filter(age__in=[1995, 1996, 1997])
    print('in 在什么中的', rs)

    # range 在什么区间的
    rs = User.objects.filter(age__range=(1994, 1996))
    print("range 在什么区间内的", rs)

    # isnull判断是否为空
    rs = User.objects.filter(age__isnull=True)
    print("isnull 判断为空", rs)

    return HttpResponse("这些就是常用的查询条件")

数据库表中的数据

运行结果

注意:运行结果中exact与iexact中的结果一样的。。。。。。。。。。。。。。。。。说明了什么?????

二.模型常用的字段类型及参数

1.常用模型类的属性类型(即字段类型)

1. IntegerField : 整型,映射到数据库中的int类型。
2. CharField:  字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
3. TextField:  文本类型,映射到数据库中的text类型。
4. BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
5. DateField:  日期类型,没有时间。映射到数据库中是date类型,
在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。
6. DateTimeField:   日期时间类型。映射到数据库中的是datetime类型,
在使用的时候,传递datetime.datetime()进去。

2.Field常用参数

primary_key:  指定是否为主键。

unique:  指定是否唯一。

null:  指定是否为空,默认为False。

blank: 等于True时form表单验证时可以为空,默认为False。

default:  设置默认值。

DateField.auto_now:  每次修改都会将当前时间更新进去,只有调用Model.save()方法才会调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及Time类才有的。

DateField.auto_now_add:  第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值

For Example

mo_xin/urls.py

from django.urls import path
from mo_xin import views
urlpatterns = [
    
    path('index7/', views.add_test),
    path('index8/', views.search_test),



]

mo_xin/views.py

from django.db import models


def add_test(request):

    Test.objects.create(name='华五1', age=22, note="来自四川资阳")

    Test.objects.create(name='华五2',age=23,note="来自四川资阳")

    return HttpResponse('插入数据成功!!!')


# 查询数据


def search_test(request):
    # 查询所有记录对象
    rs = User.objects.all()
    print(rs)
    return HttpResponse('查询数据成功!!!')

mo_xin/models.py

from django.db import models


class Test(models.Model):

    name = models.CharField(max_length=30, unique=True)
    age = models.IntegerField()
    note = models.TextField()
    create_time = models.DateField(auto_now=True)
    update_time = models.DateTimeField(auto_now_add=True)

注意,使用新建的模型类,需要创建映射,并且传送到数据库

运行结果

三.表关系的实现

1.表关系如何实现的??????????

2.表图关系

3.表关系列子

代码:

mo_xin/models.py

from django.db import models

# Create your models here.

# 学院表模型
class Department(models.Model):
    d_id = models.AutoField(primary_key=True)
    d_name = models.CharField(max_length=30)

    def __str__(self):
        return "学院表<d_id=%s,d_name=%s>" % (self.d_id, self.d_name)

#学生表
class Student1(models.Model):
    s_id = models.AutoField(primary_key=True)
    s_name = models.CharField(max_length=30)
    # 外键是一对一的时候需加上on_delete避免两个表中参数不一致报错,CASADE进行表级删除
    s_department = models.ForeignKey('Department',on_delete=models.CASCADE)
    s_course = models.ManyToManyField('Course')


    def __str__(self):
        return "学生表<s_id=%s,s_name=%s>" % (self.s_id, self.s_name)

#课程表模型
class Course(models.Model):
    c_id = models.AutoField(primary_key=True)
    c_name = models.CharField(max_length=30)

    def __str__(self):
        return "课程表<c_id=%s,c_name=%s>" % (self.c_id, self.c_name)

#学生表细节模型
class StuDetail(models.Model):
    sd_id = models.OneToOneField('Student1',on_delete=models.CASCADE)
    sd_age = models.IntegerField()
    sd_gender = models.BooleanField(default=True)
    sd_city = models.CharField(max_length=30,null=True)

    def __str__(self):
        return "学生详情表<sd_id=%s,sd_name=%s>" % (self.sd_id, self.sd_age)

创建映射文件,传递给数据库

运行结果

 

posted @ 2020-04-02 18:53  faval  阅读(69)  评论(0)    收藏  举报