python 中model.py詳解
model詳解
Django中遵循 Code Frist 的原則,即:根據程式碼中定義的類來自動生成資料庫表。
建立表
基本結構
from django.db import models
# Create your models here.
class userinfo(models.Model):
nid = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
email = models.EmailField()
ip = models.GenericIPAddressField()
memo = models.TextField()
img = models.ImageField()
usertype=models.ForeignKey("usertype",null=True,blank=True)
class usertype(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
更多欄位:
1、models.AutoField 自增列 = int(11)
如果沒有的話,預設會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設定為主鍵 primary_key=True。
2、models.CharField 字串欄位
必須 max_length 引數
3、models.BooleanField 布林型別=tinyint(1)
不能為空,Blank=True
4、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar
繼承CharField,所以必須 max_lenght 引數
5、models.DateField 日期型別 date
對於引數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立新增,之後的更新不再改變。
6、models.DateTimeField 日期型別 datetime
同DateField的引數
7、models.Decimal 十進位制小數型別 = decimal
必須指定整數位max_digits和小數位decimal_places
8、models.EmailField 字串型別(正規表示式郵箱) =varchar
對字串進行正規表示式
9、models.FloatField 浮點型別 = double
10、models.IntegerField 整形
11、models.BigIntegerField 長整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字串型別(ip4正規表示式)
13、models.GenericIPAddressField 字串型別(ip4和ip6是可選的)
引數protocol可以是:both、ipv4、ipv6
驗證時,會根據設定報錯
14、models.NullBooleanField 允許為空的布林型別
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 減號、下劃線、字母、數字
18、models.SmallIntegerField 數字
資料庫中的欄位有:tinyint、smallint、int、bigint
19、models.TextField 字串=longtext
20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字串,地址正規表示式
22、models.BinaryField 二進位制
23、models.ImageField 圖片
24、models.FilePathField 檔案
更多引數:
1、null=True
資料庫中欄位是否可以為空
2、blank=True
django的 Admin 中新增資料時是否可允許空值
3、primary_key = False
主鍵,對AutoField設定主鍵後,就會代替原來的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自動建立---無論新增或修改,都是當前操作的時間
auto_now_add 自動建立---永遠是建立時的時間
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 預設值
8、verbose_name Admin中欄位的顯示名稱
9、name|db_column 資料庫中的欄位名稱
10、unique=True 不允許重複
11、db_index = True 資料庫索引
12、editable=True 在Admin裡是否可編輯
13、error_messages=None 錯誤提示
14、auto_created=False 自動建立
15、help_text 在Admin中提示幫助資訊
16、validators=[]
17、upload-to 上傳到哪個位置,更多與image,filepath配合使用
連表結構
- 一對多:models.ForeignKey(其他表)
- 多對多:models.ManyToManyField(其他表)
- 一對一:models.ManyToManyField(其他表)
應用場景:
應用場景:
一對多:當一張表中建立一行資料時,有一個單選的下拉框(可以被重複選擇)
例如:建立使用者資訊時候,需要選擇一個使用者型別【普通使用者】【金牌使用者】【鉑金使用者】等。
多對多:在某表中建立一行資料是,有一個可以多選的下拉框
例如:建立使用者資訊,需要為使用者指定多個愛好
一對一:在某表中建立一行資料時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了
例如:原有含10列資料的一張表儲存相關資訊,經過一段時間之後,10列無法滿足需求,需要為原來的表再新增5列資料
看個例子:
from django.db import models
# Create your models here.
from django.db import models
# 陳超,普通使用者
# 淮軍,超級使用者
class Gender(models.Model):
name = models.CharField(max_length=32)
class userinfo(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30, verbose_name='使用者名稱',editable=False)
email = models.EmailField(db_index=True)
memo = models.TextField()
img = models.ImageField(upload_to='upload')
user_type = models.ForeignKey("UserType", null=True, blank=True)# unique
# user_type = models.OneToOneField("UserType", null=True, blank=True)# unique
# ctime = models.DateTimeField(auto_now_add=True)
# uptime = models.DateTimeField(auto_now=True)
# gender = models.ForeignKey(Gender)
gender_choices = (
(0, "男"),
(1, "女"),
)
gender = models.IntegerField(choices=gender_choices,default=1)
# 普通使用者,超級使用者
class UserType(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class B2G(models.Model):
boy = models.ForeignKey('Boy')
girl = models.ForeignKey('Girl')
class Boy(models.Model):
name = models.CharField(max_length=32)
# 吳文煜,王建,王志剛,杜寶強
class Girl(models.Model):
name = models.CharField(max_length=32)
f = models.ManyToManyField(Boy)
# 鐵錘,鋼彈,如花
TIPS:
-
modles.py中class設定的資料,本身返回為一個類,如果想直接返回某一個欄位的值,可以定義
__str__
,比如:class TypeUser(models.Model): name = models.CharFiled(max_length=32) def __str__(self): return self.name
-
在設定ForeignKey時,引數中的第一個引數為表名,**需要注意的是,加不加引號有區別:加引號後表的定義順序可以隨便,但不加引號必須按照順序來:
class userinfo(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=30, verbose_name='使用者名稱',editable=False) email = models.EmailField(db_index=True) memo = models.TextField() img = models.ImageField(upload_to='upload') user_type = models.ForeignKey("UserType", null=True, blank=True)# unique # user_type = models.OneToOneField("UserType", null=True, blank=True)# unique # ctime = models.DateTimeField(auto_now_add=True) # uptime = models.DateTimeField(auto_now=True) # gender = models.ForeignKey(Gender) gender_choices = ( (0, "男"), (1, "女"), ) gender = models.IntegerField(choices=gender_choices,default=1) class UserType(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name
-
多對多,有兩種建立方式
- 自建第三張表
-
自動建立,比如:
#自建第三張表 class B2G(models.Model): boy = models.ForeignKey('Boy') girl = models.ForeignKey('Girl') class Boy(models.Model): name = models.CharField(max_length=32) # 吳文煜,王建,王志剛,杜寶強 class Girl(models.Model): name = models.CharField(max_length=32) #自動建立 f = models.ManyToManyField(Boy)
-
queryset
從資料庫中提取出來的資料為queryset型別,是Django中的一種特殊型別.
可以看到,從資料庫取出個資料看起來像包含物件的列表。而實際上整個資料為django中的特殊型別QuerySet。
如果需要檢視原來的SQL語句,可以使用
queryset.query
:print(w.query)
-
values() 和 vlue_list() 與 all()區別
.all()是取得所有列的資料,可以加.values()取出某一列,每一個元素為一個字典:
obj = model.UserInfo.objects.filter(name='alex').values('id','email') # select id from userinfo where name = 'alex' queryset -> python,Django的類 [{'id':1},{'id': 2},]
values_list(),獲取到的元素為一個個元組,也可以加多個引數來獲取多列:
obj = model.UserInfo.objects.filter(name='alex').value_list('id','email') # select id from userinfo where name = 'alex' queryset -> python,Django的類 [(1,'1@qq.com'),(2,'alex@11.com'),]
表操作
基本操作
# 增
#
# models.Tb1.objects.create(c1='xx', c2='oo') 增加一條資料,可以接受字典型別資料 **kwargs
# obj = models.Tb1(c1='xx', c2='oo')
# obj.save()
# 查
#
# models.Tb1.objects.get(id=123) # 獲取單條資料,不存在則報錯(不建議)
# models.Tb1.objects.all() # 獲取全部
# models.Tb1.objects.filter(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() # 修改單條資料
進階操作(了不起的雙下劃線)
利用雙下劃線將欄位和對應的操作連線起來
# 獲取個數
#
# models.Tb1.objects.filter(name='seven').count()
# 大於,小於
#
# models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值
# models.Tb1.objects.filter(id__lt=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等於11、22、33的資料
# models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
# 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
# limit 、offset
#
# models.Tb1.objects.all()[10:20]
# group by
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"
連表操作(了不起的雙下劃線)
利用雙下劃線和 _set 將表之間的操作連線起來
資料庫表結構:
class UserProfile(models.Model):
user_info = models.OneToOneField('UserInfo')
username = models.CharField(max_length=64)
password = models.CharField(max_length=64)
def __unicode__(self):
return self.username
class UserInfo(models.Model):
user_type_choice = (
(0, u'普通使用者'),
(1, u'高階使用者'),
)
user_type = models.IntegerField(choices=user_type_choice)
name = models.CharField(max_length=32)
email = models.CharField(max_length=32)
address = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class UserGroup(models.Model):
caption = models.CharField(max_length=64)
user_info = models.ManyToManyField('UserInfo')
def __unicode__(self):
return self.caption
class Host(models.Model):
hostname = models.CharField(max_length=64)
ip = models.GenericIPAddressField()
user_group = models.ForeignKey('UserGroup')
def __unicode__(self):
return self.hostname
一對一操作:
user_info_obj = models.UserInfo.objects.filter(id=1).first()
print user_info_obj.user_type
print user_info_obj.get_user_type_display()
print user_info_obj.userprofile.password
user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
print user_info_obj.keys()
print user_info_obj.values()
一對多操作,類似於一對一:
1、搜尋條件使用 __ 連線
2、獲取值時使用 . 連線
多對多操作:
user_info_obj = models.UserInfo.objects.get(name=u'武沛齊')
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)
# 刪除資料
#group_obj.user_info.remove(user_info_obj)
#group_obj.user_info.remove(*user_info_objs)
# 新增資料
#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')
其他操作:
# F 使用查詢條件的值
#
# from django.db.models import F
# models.Tb1.objects.update(num=F('num')+1)
# Q 構建搜尋條件
from django.db.models import Q
# con = Q()
#
# q1 = Q()
# q1.connector = 'OR'
# q1.children.append(('id', 1))
# q1.children.append(('id', 10))
# q1.children.append(('id', 9))
#
# q2 = Q()
# q2.connector = 'OR'
# q2.children.append(('c1', 1))
# q2.children.append(('c1', 10))
# q2.children.append(('c1', 9))
#
# con.add(q1, 'AND')
# con.add(q2, 'AND')
#
# models.Tb1.objects.filter(con)
#
# from django.db import connection
# cursor = connection.cursor()
# cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
# row = cursor.fetchone()
xx_set中的_set
是多對多的固定搭配
擴充套件
自定義上傳
def upload_file(request):
if request.method == "POST":
obj = request.FILES.get('fafafa')
f = open(obj.name, 'wb')
for chunk in obj.chunks():
f.write(chunk)
f.close()
return render(request, 'file.html')
form上傳檔案例項
class FileForm(forms.Form):
ExcelFile = forms.FileField()
models.py:
from django.db import models
class UploadFile(models.Model):
userid = models.CharField(max_length = 30)
file = models.FileField(upload_to = './upload/')
date = models.DateTimeField(auto_now_add=True)
view.py:
def UploadFile(request):
uf = AssetForm.FileForm(request.POST,request.FILES)
if uf.is_valid():
upload = models.UploadFile()
upload.userid = 1
upload.file = uf.cleaned_data['ExcelFile']
upload.save()
print upload.file
相關文章
- python中dict詳解Python
- Python中的Super詳解Python
- 詳解Python中的程式Python
- python中list切片詳解Python
- Python中的列表詳解Python
- Python3中urlopen()詳解Python
- Python中的函式詳解Python函式
- Python中的__new__()詳解Python
- Python中Numpy函式詳解Python函式
- Python中協程(coroutine)詳解Python
- Python 中的魔術方法詳解Python
- python中setting.py詳解Python
- Python中的魔術方法詳解Python
- 詳解Python中的下劃線Python
- python 中求和函式 sum詳解Python函式
- RNN程式碼解讀之char-RNN with TensorFlow(model.py)RNN
- 詳解Python中的str.format方法PythonORM
- python中變數的命名及詳解Python變數
- Python 中__new__方法詳解及使用Python
- Python中裝飾器語法詳解Python
- python3.x中argparse模組詳解Python
- Python中enumerate函式用法詳解Python函式
- python基礎(8)python中is和==的區別詳解Python
- Python3中strip()、lstrip()、rstrip()用法詳解Python
- 詳解Python中的__init__和__new__Python
- 詳解Python中yield生成器的用法Python
- 詳細解讀Python中的__init__()方法Python
- Python中none和null的區別詳解!PythonNoneNull
- python模組詳解Python
- Python列表詳解Python
- Python @property 詳解Python
- 詳解Python GILPython
- Python socket 詳解Python
- Python 命令詳解Python
- python切片詳解Python
- Python 中的設計模式詳解之:策略模式Python設計模式
- Python3中使用PyMongo的方法詳解PythonGo
- Python3中*和**運算子的用法詳解!Python