Django 07 Django模型基礎2 (常用查詢和多表關聯)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM