1. 程式人生 > >Django——7 常用的查詢 常用的模型欄位型別 Field的常用引數 表關係的實現

Django——7 常用的查詢 常用的模型欄位型別 Field的常用引數 表關係的實現

Django

  1. 常用的查詢
    1. 常用的查詢方法
    2. 常用的查詢條件
  2. 常用欄位對映關係
  3. Field常用引數
  4. 表關係的實現

 


 

查用的查詢方法

這是需要用到的資料

from django.http import HttpResponse
from .models import User

def special_search(request):


    # 查詢所有的記錄
    res = User.objects.all()
    print(res)


    return HttpResponse('
查詢成功')

 

# 查詢第一條資料
    res = User.objects.first()

 

# 查詢最後一條資料
    res = User.objects.last()

 

# 根據條件查詢滿足條件的結果
    res = User.objects.filter(name='李四')

 

# 按條件獲取排除以後的資料
    res = User.objects.exclude(name='週六')

 

# 獲取一個物件
    res = User.objects.get(name='
王五')

 

# 對結果進行排序
    res = User.objects.order_by('age')

 

# 多項排序
    res = User.objects.order_by('age', 'id')

 

# 逆向排序
    res = User.objects.order_by('-age')

 

# 將返回的QuerySet資料轉換成字典
    res = User.objects.all().values()

 

這裡可以發現,多出了city屬性,因為

 

我沒有加上__str__的city屬性的輸出,可以得出結論:

.values()方法可以直接獲取模型資料的屬性,不需要重定義輸出

# 查詢資料的總數
    res = User.objects.count()

 

常用的常洵條件

 

查詢物件的條件的意思是傳給以上方法的一些引數。相當於是SQL語句中的where語句後面的條件,語法為欄位名__規則(是連著連個下劃線哦)

# 等於exact  iexact忽略大小寫
    res = User.objects.filter(name__exact='李四')

# 包含contains icontains 忽略大小寫
    res = User.objects.filter(name__contains='')

 

# 以什麼開始 startswith  istartswith忽略大小寫
    res = User.objects.filter(name__startswith='')

 

# 以什麼結尾 endswith iendswith忽略大小寫
    res = User.objects.filter(name__endswith='')

# 成員所屬 in
    res = User.objects.filter(age__in=[22, 23, 24])

# gt 大於
    res = User.objects.filter(age__gt=22)

# lt 小於
    res = User.objects.filter(age__lt=21)

# 大於等於或者小於等於後面加上e
    res = User.objects.filter(age__gte=22)

# 區間 range 
    res = User.objects.filter(age__range=(21, 22))

# isnull 獲取資料為空的
    res = User.objects.filter(city__isnull=True)
    # 獲取不為空的資料
    print(User.objects.filter(city__isnull=False))

 

 

 

 常用欄位對映關係

 

  • IntegerField : 整型,對映到資料庫中的int型別。
  • CharField:  字元型別,對映到資料庫中的varchar型別,通過max_length指定最大長度。
  • TextField:  文字型別,對映到資料庫中的text型別。
  • BooleanField: 布林型別,對映到資料庫中的tinyint型別,在使用的時候,傳遞True/False進去。如果要可以為空,則用NullBooleanField。
  • DateField:  日期型別,沒有時間。對映到資料庫中是date型別,在使用的時候,可以設定DateField.auto_now每次儲存物件時,自動設定該欄位為當前時間。設定DateField.auto_now_add當物件第一次被建立時自動設定當前時間。
  • DateTimeField:   日期時間型別。對映到資料庫中的是datetime型別, 在使用的時候,傳遞datetime.datetime()進去。

 

 Field的常用引數

  • primary_key:  指定是否為主鍵。
  • unique:  指定是否唯一。
  • null:  指定是否為空,預設為False。
  • blank: 等於True時form表單驗證時可以為空,預設為False。
  • default:  設定預設值。
  • DateField.auto_now:  每次修改都會將當前時間更新進去,只有呼叫,QuerySet.update方法將不會呼叫。這個引數只是Date和DateTime以及TimModel.save()方法才會呼叫e類才有的。
  • DateField.auto_now_add:  第一次新增進去,都會將當前時間設定進去。以後修改,不會修改這個值

models.py

class Test(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    note = models.TextField()
    gender = models.BooleanField(default=True)
    create_time = models.DateField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

 建立對映檔案並生成資料表

 檢視資料結構:

我們來新增資料

views:

def test(request):
    Test.objects.get_or_create(name='A', age=18, note='I am A', gender=True)
    Test.objects.get_or_create(name='B', age=19, note='I am B', gender=False)
    return HttpResponse('資料新增成功')

需要注意的一點:update_time,只用通過.save()方法,才能實現更新

 現在執行如下程式碼:

def test(request):
    # Test.objects.get_or_create(name='A', age=18, note='I am A', gender=True)
    # Test.objects.get_or_create(name='B', age=19, note='I am B', gender=False)
    Test.objects.filter(name='A').update(age=20)
    res = Test.objects.get(name='B')
    res.age = 22
    res.save()
    return HttpResponse('資料新增成功')

 

 

表資料關係

表關係舉例

建立學院表:

class Department(models.Model):
    d_id = models.AutoField(primary_key=True)
    d_name = models.CharField(max_length=10)
    def __str__(self):
        return 'Department<d_id=%s, d_name=%s>'%(
            self.d_id, self.d_name
        )

 

 建立學生表,與學院表成一對多,外來鍵關聯:

class Student(models.Model):
    s_id = models.IntegerField(primary_key=True)
    s_name = models.CharField(max_length=10)
    department = models.ForeignKey('Department', on_delete=models.CASCADE)
def __str__(self):
        return 'Student<s_id=%s, s_name=%s>'%(
            self.s_id, self.s_name
        )

 

學生詳情表,與學生表一對一

class Stu_Detail(models.Model):
    s_id = models.OneToOneField('Student', on_delete=models.CASCADE)
    age = models.IntegerField()
    gender = models.BooleanField(default=True)
    city = models.CharField(max_length=30)
    def __str__(self):
        return 'Stu_Detail<s_id=%s, age=%s, gender=%s, city=%s>'%(
            self.s_id, self.age, self.gender, self.city
        )

 

 課程表,與學生表成多對多,自動生成三方表

class Course(models.Model):
    c_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10)
    student = models.ManyToManyField('Student')
def __str__(self):
        return 'Course<c_id=%s, name=%s>'%(
            self.c_id, self.name
        )

 

 注意:

  • 外來鍵和一對一關係的時候需要加on_delete選項,此引數為了避免兩個表裡的資料不一致問題,不然會報錯!
  • 一般使用CASCADE表示級聯刪除


執行完makemigrations和migrate的命令後,在資料庫我們能看到5張表,其中多對多關係的ManyToManyField
方法自動生成了關係表.