1.Django中對數據的查詢:
(1)常用的查詢方法:
#下面這倆方法雖然作用一致(獲取到對應的實例對象),但我們使用頻繁的是.first()以及.last()方法。
#原因:如果查詢的數據不存在的話,使用下標查詢會報錯;但是使用.first()不會報錯,會返回None。
s = User.objects.filter(age=18).first() #獲取QuerySet中的第一條數據
s2 = User.objects.filter(age=18).last() #獲取QuerySet中的最後一條數據
s = User.objects.filter(age=18)[0]
print(s)
#應用場景:
a = User.objects.get(id=56) #使用get方法,我們可以保證id不會重複,但是不能保證id爲56的數據是否存在
#但是使用.first()方法哪怕它不存在也不會報錯!
a = User.objects.filter(id=56).first()
#過濾得到name爲xiaoming的數據:
b = User.objects.filter(name='xiaoming')
#排除name爲xiaoming的數據,過濾得到除此之外的:
b2 = User.objects.exclude(name='xiaoming')
#根據age順序排序:
c = User.objects.all().order_by("age")
#根據age逆序排序:
c2 = User.objects.all().order_by("-age")
#雙重排序:age順序排序,如果有age相同的則以id逆序排序:
c3 = User.objects.all().order_by("age","id")
#將返回的QuerySet中的models.py中規定的格式轉換爲字典:
d = User.objects.all().values()
#作用:現在是字典形式了,就可以使用字典的方法進行獲取數據了:
print(d[0].get("name"))
#獲取當前查詢到的數據的總數:
e = User.objects.count()
(2)常用的查詢條件:
(查找對象的條件的意思是傳給以上方法的一些參數。相當於是SQL語句中的where語句後面的條件,語法爲字段名__規則)
#exact相當於等號:(以下兩種方法作用一致!) iexact跟exact一致,但是忽略大小寫!
rs = User.objects.filter(name__exact='xiaoming')
rs = User.objects.filter(name='xiaoming')
#contains是包含: icontains跟contains一致,但是忽略大小寫!
rs = User.objects.filter(name__contains='xiao') #查詢name屬性值中包含xiao的
#startwith 以什麼開始: istartwith跟startwith一致,但是忽略大小寫!
rs = User.objects.filter(name__startswith='xiao')
#endwith 以什麼結尾: iendwith跟endwith一致,但是忽略大小寫!
#in 成員所屬:
rs = User.objects.filter(age__in=[18,19,20])
#gt大於
rs = User.objects.filter(age__gt=20)
#gte 大於等於
rs = User.objects.filter(age__gte=20)
#lt 小於
rs = User.objects.filter(age__lt=20)
#lte 小於等於
rs = User.objects.filter(age__lte=20)
#range 區間
rs = User.objects.filter(age__range=(18,20))
#isnull 判斷是否爲空
rs = User.objects.filter(age__isnull=True)
2.Django中定義模型(模型實現通過類,對應可生成數據庫中的表)
(1)常用的字段類型映射關係:
(2)常用的字段類型:
- 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()進去。
(3)Field的常用參數:
primary_key: 指定是否爲主鍵。
unique: 指定是否唯一。
null: 指定是否爲空,默認爲False。
blank: 等於True時form表單驗證時可以爲空,默認爲False。
default: 設置默認值。
DateField.auto_now: 每次修改都會將當前時間更新進去
DateField.auto_now_add: 第一次添加進去,都會將當前時間設置進去。以後修改,不會修改這個值
(4)動手實踐:
①模型的定義(models.py文件):
from django.db import models
# Create your models here.
class Article(models.Model):
name = models.CharField(max_length=30,unique=True) #unique唯一
up = models.IntegerField(null=True) #null 允許爲空
text = models.TextField()
# 邏輯刪除:比如你刪除你的一條微信朋友圈,可能就只是將此默認值改爲了False,在用戶看來他已經刪了這個,但是實際上後臺人員仍可查詢到數據!
is_delete = models.BooleanField(default=True)
create_time = models.DateField(auto_now_add=True) #日期時間 auto_now_add當字段被創建時自動設置爲當前時間
update_time = models.DateTimeField(auto_now=True) #日期時間,自動設置該字段爲當前時間
②切記:因爲我們添加了一個新模型,因此需要再次遷移數據庫。過程:修改models.py,執行命令makemigrations music,再執行命令migrate music。
③觀察可知對應的表已經映射到數據庫中:
④使用Django對數據庫中對應的表進行數據的增加與修改(views.py文件):
from .models import User,Article
def add_user(request):
Article.objects.create(name="橘子洲頭",text="橘子洲有青年藝術雕塑、問天台等景點,史載橘子洲生成於晉惠帝永興二年(305年),爲激流回旋沖積、沙石堆積而成。景區內生長着數千種花草藤蔓植物,其中名貴植物就有143種。還有鷗、狐、獾等許多珍稀動物。")
Article.objects.create(name="南嶽衡山",text="橘子洲有青年藝術雕塑、問天台等景點,史載橘子洲生成於晉惠帝永興二年(305年),爲激流回旋沖積、沙石堆積而成。景區內生長着數千種花草藤蔓植物,其中名貴植物就有143種。還有鷗、狐、獾等許多珍稀動物。")
return HttpResponse("插入數據成功!")
⑤如果我們再進行數據修改的話(views.py文件):
from .models import User,Article
def add_user(request):
j = Article.objects.get(id=2)
j.text = "1982年,衡山風景區被列入第一批國家級重點風景名勝區名單;2006年2月,衡山入選首批國家自然與文化雙遺產名錄;2007年5月,衡山風景區被評爲首批國家5A級旅遊景區;2007年8月,衡山被列爲國家級自然保護區。"
j.save()
return HttpResponse("插入數據成功!")
注意:被修改的第二條數據的create_time字段名不會改變;但是對應的字段名update_time會自動改爲當前時間!
3.表關係的實現:
實踐:
(1)模型的定義(models.py文件):
class Department(models.Model):
"""
學院表
"""
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30)
def __str__(self):
return "Department<d_id=%s,d_name=%s>"%(self.d_id,self.d_name)
class Student(models.Model):
"""
學生表
"""
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
# on_delete級聯刪除。 參數CASCADE的意思是如果對應的學院被刪除了,那麼對應的學院下面的學生數據也跟着刪除!
department = models.ForeignKey("Department",on_delete=models.CASCADE) #通過外鍵實現學生表和學院表之間的多對一關係!
# Django的ORM模型使得我們實現多對多不需要再建一箇中間表,而之間使用.ManyToMany()方法建字段名即可自動生成!
course = models.ManyToManyField("Course") #通過.ManyToMany()方法實現課程表和學生表之間的多對多關係
def __str__(self):
return "Student<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 "Course<c_id=%s,c_name=%s>" % (self.c_id, self.c_name)
class Stu_detail(models.Model):
"""
學生詳情表
"""
#Student代表外鍵的意思;.OneToOneField()代表唯一。外鍵加唯一實現一對一的關係
Student = models.OneToOneField("Student",on_delete=models.CASCADE) #通過外鍵加唯一實現學生表和學生詳情表之間的一對一關係!
age = models.IntegerField()
phone = models.CharField(max_length=11)
def __str__(self):
return "Stu_detail<age=%s,phone=%s>" % (self.age, self.phone)
(2)切記:因爲我們添加了一個新模型,因此需要再次遷移數據庫。過程:修改models.py,執行命令makemigrations music,再執行命令migrate music。(不要嫌棄我一遍又一遍的說哦)
(3)數據庫中查看咱的表:
在數據庫我們能看到5張表,其中多對多關係的ManyToManyField方法自動生成了關係表!!!