Django——7 常用的查詢 常用的模型欄位型別 Field的常用引數 表關係的實現
阿新 • • 發佈:2018-12-28
Django
這是需要用到的資料
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()進去。
- 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
方法自動生成了關係表.