django model 操做總結

使用場景

  1. 一對一:在某表中建立一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了)。//兩個表的數據一一對應
  2. 例如:原有含10列數據的一張表保存相關信息,通過一段時間以後,10列沒法知足需求,須要爲原來的表再添加5列數據。
  3. 一對多:當一張表中建立一行數據時,有一個單選的下拉框(能夠被重複選擇)。//表1的數據能夠在表2裏面重複出現
  4. 例如:建立用戶信息時候,須要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
  5. 多對多:在某表中建立一行數據是,有一個能夠多選的下拉框。//表1和表2均可以在各自的表項裏重複出現
  6. 例如:建立用戶信息,須要爲用戶指定多個愛好。

 

Customer模型:數據庫

    class Customer(models.Model):django

    name = models.CharField(max_length=32)
qq = models.CharField(max_length=64,unique=True)
weixin = models.CharField(max_length=64,blank=True,null=True)
age = models.PositiveSmallIntegerField(blank=True,null=True)
referral_from = models.ForeignKey("Customer",related_name="my_referrals",
blank=True,null=True,verbose_name="轉介紹",on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True) #auto_now_add自動增長

def __str__(self):
return self.name

class Meta:
verbose_name_plural = "客戶信息表"
verbose_name = "客戶信息表"

----------------------------------------------------------
Enrollment模型:
class Enrollment(models.Model):
"""學員報名信息"""
customer = models.ForeignKey("Customer",on_delete=models.CASCADE,related_name='entries')
class_grade = models.ForeignKey("ClassList",on_delete=models.CASCADE)
enrollment_date = models.DateField()
def __str__(self):
#return self.customer

class Meta:
unique_together = ("customer","class_grade")
---------------------------------------------------------------------------
FollowUpRecord模型
class FollowUpRecord(models.Model):
customer = models.ForeignKey("Customer",on_delete=models.CASCADE)
content = models.TextField(max_length=1024)
def __str__(self):
return "%s" % self.customer
----------------------------------------------------------------------------
ClassList模型:
class ClassList(models.Model):
semester = models.PositiveSmallIntegerField(verbose_name="學期")
class_type_choices = ((0,'脫產'),(1,'週末'),(2,'網絡'))
start_date = models.DateField()
end_date = models.DateField()

-----------------------------------------------------------------------------------------------------------

1、單表查詢

ruby

models.Tb1.objects.create(c1='xx', c2='oo') 網絡

增長一條數據,能夠接受字典類型數據 **kwargs app

obj = models.Tb1(c1='xx', c2='oo') obj.save()spa

 

code

models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) 對象

models.Tb1.objects.all() # 獲取所有 unicode

models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 rem

models.Tb1.objects.exclude(name='seven') # 獲取指定條件的數據

 

models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據

 

models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs

obj = models.Tb1.objects.get(id=1)

obj.c1 = '111'

obj.save()

 

2、查詢簡單操做


獲取個數

models.Tb1.objects.filter(name='seven').count()

大於,小於

models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值
models.Tb1.objects.filter(id__gte=1) # 獲取id大於等於1的值
models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值
models.Tb1.objects.filter(id__lte=10) # 獲取id小於10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值

in

models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於十一、2二、33的數據
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in

isnull
Entry.objects.filter(pub_date__isnull=True)

contains

models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
models.Tb1.objects.exclude(name__icontains="ven")

range

models.Tb1.objects.filter(id__range=[1, 2]) # 範圍bettwen and

其餘相似

startswith,istartswith, endswith, iendswith,

order by

models.Tb1.objects.filter(name='seven').order_by('id') # asc
models.Tb1.objects.filter(name='seven').order_by('-id') # desc

group by--annotate

from django.db.models import Count, Min, Max, Sum
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

limit 、offset

models.Tb1.objects.all()[10:20]

regex正則匹配,iregex 不區分大小寫

Entry.objects.get(title__regex=r'^(An?|The) +')
Entry.objects.get(title__iregex=r'^(an?|the) +')

date

Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

year

Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)

month

Entry.objects.filter(pub_date__month=12)
Entry.objects.filter(pub_date__month__gte=6)

day

Entry.objects.filter(pub_date__day=3)
Entry.objects.filter(pub_date__day__gte=3)

week_day

Entry.objects.filter(pub_date__week_day=2)
Entry.objects.filter(pub_date__week_day__gte=2)

hour

Event.objects.filter(timestamp__hour=23)
Event.objects.filter(time__hour=5)
Event.objects.filter(timestamp__hour__gte=12)

minute

Event.objects.filter(timestamp__minute=29)
Event.objects.filter(time__minute=46)
Event.objects.filter(timestamp__minute__gte=29)

second

Event.objects.filter(timestamp__second=31)
Event.objects.filter(time__second=2)
Event.objects.filter(timestamp__second__gte=31)

 

 

 

3、一對多 使用ForeignKey查詢

約束 節省硬盤 可是多表查詢會下降速度,大型程序反而不使用外鍵,而是用單表(約束的時候,經過代碼判斷)

正向查詢

關係模型Enrollment包含關聯模型Customer的ForeignKey, 模型Enrollment的實例能夠經過關聯字段訪問Customer實例:

查:

>>> e = Enrollment.objects.get(id=2)         #注意:此處不能用e =Enrollment.objects.filter(id=2)

>>> e.customer                                          # 經過上查詢到的e對象,關聯字段( e.customer )訪問到Customer實例

e.customer並調用save方法存入數據庫

>>> e.customer= some_customer

>>> e.save()

 

若是ForeignKey 字段有null=True 設置(即它容許NULL值),能夠分配None來刪除對應的關聯性

>>> e.customer= null

>>> e.save()

 

反向查詢

已經獲得模型Customer的實例,須要查詢該以該實例爲外鍵的相關模型(如FollowUpRecord和Enrollment),可使用查詢集API取出相應的實例。

外鍵沒有指定related_name的相關模型:FollowUpRecord

>>> customer = models.ForeignKey("Customer",on_delete=models.CASCADE)

反查找使用 模型類名小寫_set.all() ,方法以下:

>>>  c = Customer.objects.get(id=1)

>>>  c.followuprecord_set.all()

 

外鍵指定related_name的相關模型:FollowUpRecord

customer = models.ForeignKey("Customer",on_delete=models.CASCADE,related_name='entries')
反查找不能使用 模型類名小寫_set.all(),須要使用related_name的值,方法以下:

>>>  c = Customer.objects.get(id=1)

>>>  c.entries.all()

 

3、多對多 ManyToMany

 

class UserGroup(models.Model):
    caption = models.CharField(max_length=64)
    user_info = models.ManyToManyField('UserInfo')
    def __unicode__(self):
        return self.caption

user_info_obj = models.UserInfo.objects.get(name='alisa')
user_info_objs = models.UserInfo.objects.all()

group_obj = models.UserGroup.objects.get(caption='CEO')
group_objs = models.UserGroup.objects.all()

# 添加數據
#group_obj.user_info.add(user_info_obj)

group_obj.user_info.add(*user_info_objs)


#例:1,2,3分別表明user_info.的主鍵id

group_obj.user_info.add(1,2,3)

group_obj.user_info.add([1,2,3])



# 刪除數據
#group_obj.user_info.remove(user_info_obj)
#group_obj.user_info.remove(*user_info_objs)

#例:1,2,3分別表明user_info.的主鍵id

group_obj.user_info.remove(1,2,3)

group_obj.user_info.remove([1,2,3])

# 反向添加數據#user_info_obj.usergroup_set.add(group_obj)#user_info_obj.usergroup_set.add(*group_objs) # 反向刪除數據#user_info_obj.usergroup_set.remove(group_obj)#user_info_obj.usergroup_set.remove(*group_objs) # 獲取數據#print group_obj.user_info.all()#print group_obj.user_info.all().filter(id=1) #反向 獲取數據#print user_info_obj.usergroup_set.all()#print user_info_obj.usergroup_set.all().filter(caption='CEO')#print user_info_obj.usergroup_set.all().filter(caption='DBA')

相關文章
相關標籤/搜索