Django 07 Django模型基礎2 (常用查詢和多表關聯)
一、常用查詢
#查找數據 def search_user(request): #獲取 rs = User.objects.first() #獲取第一條數據 rs = User.objects.last() #獲取最后一條數據 rs = User.objects.filter(name = 'TAKA') #獲取name為TAKA的數據,返貨queryset類型,可以用rs[0]來查詢 rs = User.objects.exclude(name = 'TAKA') #排除name為TAKA的數據 rs = User.objects.get(name = 'TAKA') #獲取name為TAKA的記錄對象,獲取的對象具有唯一性,如果獲取多個就報錯 #排序 order_by rs = User.objects.order_by('age') #以age為准則正向排序 rs = User.objects.order_by('age','id') #以age為第一准則,id為第二准則正向排序 rs = User.objects.order_by('-age') #以age為准則逆向排序 #其他方法 rs = User.objects.all().values() #將返回的qureyset中的model轉換為字典 rs = User.objects.count() #獲取當前查詢的數據的總數 rs = User.objects.filter(name__exact='budong') #name_exact相當於name rs = User.objects.filter(name__iexact='budong') #name_iexact跟上面的區別是這個忽略大小寫 #模糊查詢 rs = User.objects.filter(name__contains='i') #name中包含i的對象 rs = User.objects.filter(name__icontains='i') #name中包含i的對象,忽略大小寫 rs = User.objects.filter(name__startswith='b') #name中以b開頭的的對象 rs = User.objects.filter(name__istartswith='b') #name中以b開頭的的對象,忽略大小寫 rs = User.objects.filter(name__endswith='b') # name中以b結尾的的對象 rs = User.objects.filter(name__iendswith='b') # name中以b結尾的的對象,忽略大小寫 rs = User.objects.filter(age__in=[18,19,20]) #in成員所屬,age在18,19,20的對象 rs = User.objects.filter(age__gt=18) #age大於18的對象 rs = User.objects.filter(age__gte=18) #age大於等於18的對象 rs = User.objects.filter(age__lt=18) #age小於18的對象 rs = User.objects.filter(age__lte=18) #age小於18的對象 rs = User.objects.filter(age__range=(18,20)) #age在18到20之間的對象,都包括 rs = User.objects.filter(age__isnull=True) #判斷age欄是否為空 print(rs) return HttpResponse('查找數據成功')
二、常用類型和字段參數
#常用的字段類型映射關系 int ----------- IntegetField #整型,映射到數據庫中的int類型 varchar ----------- CharFileld #字符串類型,通過max_length指定最大長度 longtext ----------- TextFiled #長文本 tinyint ----------- BooleanField #布爾類型,在使用的時候,傳遞True/False進去;如果為空,則為NullBooleanField date ----------- DateFiled #日期;在使用的時候,可以設DateField.auto_now_add當對象第一次被創建的時候自動設置創建時間 datetime ----------- DatetimeField #時間
#Field的常用參數 primary_key #主鍵 unique #唯一鍵 null #是否為空,默認為False blank #等於True時form表單驗證是可以為空,默認為False default #默認值 DateField.auto_now#每次修改都會把當前時間更新進去,只用調用Model.save()方法才會調用,Queryset.update方法將不會調用。這個參數只是Date和Datetime以及Time類才有的 Datetime.auto_now_add# 第一次添加進去,都會講搶錢時間設置進去。以后修改,不會修改這個值
class Ftest(models.Model): name = models.CharField(max_length=30,unique=True) #名字,最大長度30,唯一鍵 age = models.IntegerField() #年齡 note = models.TextField() #長文本 gender = models.BooleanField(default=True) #性別,默認為女(1) create_time = models.DateTimeField(auto_now_add=True) #創建時間,不更改 update_time = models.DateTimeField(auto_now=True) #更新時間,會自動更改 from .models import Ftest def add_ftest(request): Ftest.objects.create(name='愛寶貝',age=25,note='啦啦啦啦',gender=False) return HttpResponse('插入數據成功') def update_ftest(request): # Ftest.objects.filter(id=2).update(age=80) #使用fiiter是不能成功使用auto_now的,因為是queryset f = Ftest.objects.get(id=2) #get獲取的對象,在使用save才能成功使用auto_now f.age = 55 f.save() return HttpResponse('更新數據成功')
三、表關系的建立
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) class Student(models.Model): s_id = models.AutoField(primary_key=True) s_name = models.CharField(max_length=30) department = models.ForeignKey('Department', on_delete=models.CASCADE) # 由於有學生所屬學院的關系在,要將這個表與Department表關聯在一起, # 就可以用外鍵約束起來,這個department關聯的是Department表的id,on_delete表示的是上面的數據刪除,這個表也會把相關的數據刪除 #一對多關系用外鍵約束即可,默認關聯表的主鍵 class Stu_Detail(models.Model): s_id = models.OneToOneField('Student',on_delete=models.CASCADE) #一對一關系,用Onetoone;同樣要加上on_delete age = models.IntegerField() gender = models.BooleanField(default=1) city = models.CharField(max_length=30) class Course(models.Model): c_id = models.AutoField(primary_key=True) c_name = models.CharField(max_length=30) student = models.ManyToManyField('Student') #課程表和學生信息表有這多對多的關系,直接用Manytomany來實現關聯,會生成一個中間表,不用加on_delete
