(八)Django學習——常用的查詢數據的方法以及查詢條件;常用的字段類型映射關係,字段類型及Field的常用參數;Django的表關係的實現(一對多,一對一,多對多))

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)常用的字段類型:

  1. IntegerField : 整型,映射到數據庫中的int類型。
  2. CharField: 字符類型,映射到數據庫中的varchar類型,通過max_length指定最大長度。
  3. TextField: 文本類型,映射到數據庫中的text類型。
  4. BooleanField: 布爾類型,映射到數據庫中的tinyint類型,在使用的時候,傳遞True/False進去。如果要可以爲空,則用NullBooleanField。
  5. DateField: 日期類型,沒有時間。映射到數據庫中是date類型, 在使用的時候,可以設置DateField.auto_now每次保存對象時,自動設置該字段爲當前時間。
    設置DateField.auto_now_add當對象第一次被創建時自動設置當前時間。
  6. 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方法自動生成了關係表!!!

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章