Django 模型
一.創建?django project
django-admin startproject django_model
二.新建App
python manage.py startapp app01
三. 更改settings配置,使用mysql數據庫
1.更改django中__init.py__
import pymysql pymysql.install_as_MySQLdb()2.settings設置,將DATABASE配置為mysql數據庫
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME':'db01','USER': 'root','PASSWORD': '123','HOST': '192.168.11.100','PORT': '3306',} }四. APP注冊,在settings中配置
# Application definition INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01', ]五.表創建?
1.創建Model,之后可以根據Model來創建數據庫表
from django.db import modelsclass userinfo(models.Model):name = models.CharField(max_length=30)email = models.EmailField()memo = models.TextField() 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=Truedjango的 Admin 中添加數據時是否可允許空值 3、primary_key = False主鍵,對AutoField設置主鍵后,就會代替原來的自增 id 列 4、auto_now 和 auto_now_addauto_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 更多參數2、連表關系:
- 一對多,models.ForeignKey(ColorDic)
- 一對一,models.OneToOneField(OneModel)
- 多對多,authors = models.ManyToManyField(Author)
應用場景:
-
一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了)。
例如:原有含10列數據的一張表保存相關信息,經過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數據。
-
一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)。
例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
-
多對多:在某表中創建一行數據是,有一個可以多選的下拉框。
例如:創建用戶信息,需要為用戶指定多個愛好。
-
3、數據庫操作
- 增加:創建實例,并調用save
- 更新:a.獲取實例,再sava;b.update(指定列)
- 刪除:a. filter().delete(); b.all().delete()
- 獲取:a. 單個=get(id=1) ;b. 所有 = all()
- 過濾:filter(name='xxx');filter(name__contains='');(id__in = [1,2,3]) ;
icontains(大小寫無關的LIKE),startswith和endswith, 還有range(SQLBETWEEN查詢)'gt', 'in', 'isnull', 'endswith', 'contains', 'lt', 'startswith', 'iendswith', 'icontains','range', 'istartswith' - 排序:order_by("name") =asc ;order_by("-name")=desc
- 返回第n-m條:第n條[0];前兩條[0:2]
- 指定映射:values
- 數量:count()
- 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
- 原始SQL
上傳文件實例:
class FileForm(forms.Form):ExcelFile = forms.FileField() FORM from django.db import modelsclass UploadFile(models.Model):userid = models.CharField(max_length = 30)file = models.FileField(upload_to = './upload/')date = models.DateTimeField(auto_now_add=True) model def UploadFile(request):uf = AssetForm.FileForm(request.POST,request.FILES)if uf.is_valid():upload = models.UploadFile()upload.userid = 1upload.file = uf.cleaned_data['ExcelFile']upload.save()print upload.file View五. 一對多表操作
5.2 創建表
from django.db import models # Create your models here. class UserType(models.Model):nid = models.AutoField(primary_key=True)caption = models.CharField(max_length=32)class UserInfo(models.Model):user = models.CharField(max_length=32)pwd = models.CharField(max_length=32)email = models.EmailField()user_type = models.ForeignKey(UserType) 終端運行創建表 python manage.py makemigrations python manage.py migrate5.3 表中新增數據
可以使用creat,或者add
from django.shortcuts import render,HttpResponse from app01 import models# Create your views here. def Index(request):#Usertype表中插入數據models.UserType.objects.create(caption="普通用戶")models.UserType.objects.create(caption="管理員")models.UserType.objects.create(caption="超級管理員")#UserInfo表中插入數據models.UserInfo.objects.create(user="Peter",pwd="123",email="peter@gmail.com",user_type_id=2)models.UserInfo.objects.create(user="Sam",pwd="123",email="Sam@gmail.com",user_type_id=2)user_info_dict ={'user': "Mary","pwd": "123","email": "Mary@gmail.com","user_type_id": 1}models.UserInfo.objects.create(**user_info_dict)return HttpResponse("Ok")5.4 數據查詢
多表查詢技巧:
? ? ? ?__:兩個下劃線可以生成連接查詢,查詢關聯的字段信息
? ? ? _set:提供了對象訪問相關聯表數據的方法。但是這種方法只能是相關類訪問定義了關系的類(主鍵類訪問外鍵類)
def Index(request):#連表查詢,filter條件過濾,__連表操作ret = models.UserInfo.objects.filter(user_type__caption="管理員").values("user","pwd")print(ret)#連表查詢, 不加filter條件過濾查詢所有ret = models.UserInfo.objects.values('user', 'pwd', 'user_type__caption')for item in ret:print(item)return HttpResponse("Ok")?六. 多對多表操作
1.創建多對多關系表
from django.db import models# Create your models here. class Author(models.Model):"""作者"""name = models.CharField(max_length=100)age = models.IntegerField()class BookType(models.Model):"""圖書類型"""caption = models.CharField(max_length=64)class Book(models.Model):"""圖書"""name = models.CharField(max_length=64)pages = models.IntegerField()price = models.DecimalField(max_digits=10,decimal_places=2)pubdate = models.DateField()authors = models.ManyToManyField(Author)book_type = models.ForeignKey(BookType)2.創建數據
#新增作者models.Author.objects.create(name="Peter",age=23)models.Author.objects.create(name="David",age=23)models.Author.objects.create(name="Jim",age=20)#booktypemodels.BookType.objects.create(caption="文學類")models.BookType.objects.create(caption="歷史")models.BookType.objects.create(caption="自然")models.BookType.objects.create(caption="科學技術")#bookmodels.Book.objects.create(name='向自由起飛',pages=260,price=45,pubdate='2016-11-20',book_type_id=1)models.Book.objects.create(name='華夏發展史',pages=1800,price=95,pubdate='2010-11-20',book_type_id=2)models.Book.objects.create(name='量子論',pages=800,price=75,pubdate='2014-11-20',book_type_id=4)book_info_dict = {'name': 'python入門','pages': 600,'price': 89,'pubdate': '2013-10-11',"book_type_id": 4}models.Book.objects.create(**book_info_dict)3.向關系表中加入數據?
#將book_id3,4,5加入author_id為1的作者aut = models.Author.objects.get(id=1)aut.book_set.add(*models.Book.objects.filter(id__gt=2))aut = models.Author.objects.get(id=2)aut.book_set.add(models.Book.objects.get(id=1))#作者id 2-3 共同創作了book_id 為2的著作obj = models.Book.objects.get(id=2)q = models.Author.objects.filter(id__gt=1)obj.authors.add(*q)ret = models.BookType.objects.all()for item in ret:print(item.caption)?4.查詢
#1.查詢所有圖書類型為“文學”的所有書籍的名稱,價格,發布時間,圖書類型的兩種方式result1_method1 = models.Book.objects.filter(book_type__caption="文學").values("name","price","pubdate","book_type__caption")print(result1_method1)result1_method2 = models.BookType.objects.filter(caption="文學").values("book__name","book__price","book__pubdate","caption")print(result1_method2)#2.查詢作者為"Peter"參與編寫的所有書籍的名稱,價格,發布時間,圖書類型,作者的兩種方法result2_method1 = models.Book.objects.filter(authors__name="Peter").values\("name","price","pubdate","authors__name")print(result2_method1)result2_method2 = models.Author.objects.filter(name="Peter").values("name","book__price","book__name","book__pubdate")print(result2_method2)return HttpResponse("ok")多對多總結:
正向添加操作:通過表中有m2m操作:(*對象)。注:加*是因為后面獲取到的是列表
反向添加操作:通過表中沒有m2m操作:表名_set
實例:Q
先將文件進行配置
STATIC_URL = '/static/' STATICFILES_DIRS = (os.path.join(BASE_DIR,"static"), ) static DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME':'Django003','USER': 'root','PASSWORD': '','HOST': '','PORT': '',} } settings.py之MySQL MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware', ] settings之csrf注銷 from django.db import models# Create your models here. class Author(models.Model):"""作者"""name = models.CharField(max_length=100)age = models.IntegerField()class BookType(models.Model):"""圖書類型"""caption = models.CharField(max_length=64)class Book(models.Model):"""圖書"""name = models.CharField(max_length=64)pages = models.IntegerField()price = models.DecimalField(max_digits=10,decimal_places=2)pubdate = models.DateField()authors = models.ManyToManyField(Author)book_type = models.ForeignKey(BookType)def __str__(self):return 'obj:%s-%s' %(self.name,self.price) models.py urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^test', views.test),url(r'^index', views.index), ] urls from django.shortcuts import render,HttpResponse from app01 import models # Create your views here.# def test(request): # #數據庫添加數據 # models.BookType.objects.create(caption='技術') # models.BookType.objects.create(caption='文學') # models.BookType.objects.create(caption='動漫') # models.BookType.objects.create(caption='男人裝') # # models.Book.objects.create(name='文藝復興',pages='100',price='40',pubdate='1992-11-2',book_type_id='1') # models.Book.objects.create(name='解密',pages='80',price='10', pubdate='2016-6-10',book_type_id='2') # models.Book.objects.create(name='刀鋒',pages='50',price='3', pubdate='2014-02-16',book_type_id='2') # models.Book.objects.create(name='查令十字路84號',pages='260',price='40',pubdate='1999-10-12',book_type_id='3') # models.Book.objects.create(name='紅樓',pages='1000',price='500', pubdate='1760-1-1',book_type_id='3') # models.Book.objects.create(name='將夜',pages='2000',price='300', pubdate='2010-3-3',book_type_id='1') # models.Book.objects.create(name='mysql從刪庫到跑路',pages='20',price='10',pubdate='1998-9-2',book_type_id='4') # models.Book.objects.create(name='馬克思主義',pages='50',price='100',pubdate='1937-3-3',book_type_id='2') # # return HttpResponse('ok')import json from datetime import date from datetime import datetime from decimal import Decimal #序列化類 class JsonCustomEncoder(json.JSONEncoder):def default(self, field):if isinstance(field, datetime):return field.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(field, date):return field.strftime('%Y-%m-%d')elif isinstance(field, Decimal):return str(field)else:return json.JSONEncoder.default(self, field)def index(request):if request.method == 'POST': #判斷是否是post訪問,接收post請求ret = {'status': False, 'message': '', 'data':None}try:post_data = request.POST.get('post_data',None) #獲取到前端發來的post_data,如果沒有默認Nonepost_data_dict = json.loads(post_data) #將post_data反序列化成字典print(post_data_dict)# {'name': ['11', 'sdf'],'price': ['11', 'sdf']}# 構造搜索條件 去數據庫進行搜索from django.db.models import Qcon = Q()for k,v in post_data_dict.items():q = Q()q.connector = 'OR' #創建或的關系for item in v: #循環列表q.children.append((k, item)) #循環出來的多個item是添加到或的關系con.add(q, 'AND') #將或的關系添加到and的關系中"""序列化ret = models.Book.objects.filter(con)print(ret) # ret是queryset,[對象]from django.core import serializersdata = serializers.serialize("json", ret)print(type(data),data) # 字符串""""""#ret = models.Book.objects.filter(con).values('name','book_type__caption')ret = models.Book.objects.filter(con).values_list('name', 'book_type__caption')print(ret,type(ret)) #ret外面是queryset對象,里面是字典li = list(ret) #轉換成列表,里面是字典data = json.dumps(li)print(data,type(data))"""result = models.Book.objects.filter(con).values('name','price','pubdate','book_type__caption')# result = models.Book.objects.filter(con)是queryset對象li = list(result) #轉換成列表,里面是字典,values_list內部元素的列表ret['status'] = Trueret['data'] = li #將列表信息添加到ret字典except Exception as e:ret['message'] = str(e)ret_str = json.dumps(ret, cls=JsonCustomEncoder) #將queryset轉換成字符串返回到前臺print(ret_str)return HttpResponse(ret_str) #返回字符串return render(request, 'index.html') views.py <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><style>.left{float: left;}.clearfix:after{content: '.';clear: both;display: block;visibility: hidden;height: 0;}</style> </head> <body><div class="condition"><div class="item clearfix"><div class="icon left" οnclick="AddCondition(this);">+</div><div class="left"><select οnchange="ChangeName(this);"><option value="name">書名</option><option value="book_type__caption">圖書類型</option><option value="price">價格</option><option value="pages">頁數</option></select></div><div class="left"><input type="text" name="name" /></div></div></div><div><input type="button" οnclick="Search();" value="搜索" /></div><div class="container"></div><script src="/static/jquery-1.12.4.js"></script><script>function AddCondition(ths) {var new_tag = $(ths).parent().clone(); //點加號時找到父級,克隆整個divnew_tag.find('.icon').text('-'); //克隆的div將加號變成減號new_tag.find('.icon').attr('onclick', 'RemoveCondition(this);'); //將減號綁定事件$(ths).parent().parent().append(new_tag); //將克隆的div添加到指定位置}function RemoveCondition(ths) { //減號綁定事件$(ths).parent().remove(); //點擊減號將會移除div}function ChangeName(ths) { //下拉框綁定事件var v = $(ths).val(); //獲得當前框的值:可獲得name,book_type__caption,price,pages$(ths).parent().next().find('input').attr('name',v); //找到當前框對應的input標簽的name屬性和賦值,如:name=name,name=book_type__caption}function Search() { //將獲取的值提交后臺var post_data_dict = {};// 獲取所有input的內容,提交數據$('.condition input').each(function () { //循環div里面所有的input// console.log($(this)[0])var n = $(this).attr('name'); //獲取當前input的namevar v = $(this).val(); //獲取當前input標簽里面輸入的值var v_list = v.split(','); //將輸入的值用中文逗號進行分割post_data_dict[n] = v_list; //將name和分割后的值添加到字典中}); {# console.log(post_data_dict);#}var post_data_str = JSON.stringify(post_data_dict); //將字典轉換成字符串$.ajax({url:"/index/", //index后面必須加/type:"POST",data:{"post_data":post_data_str},dataType:"json",success:function (arg) {//arg返回的是json對象,寫上dataType:"json",就可以直接寫arg.status。if(arg.status){ //后端返回來的status為真var table = document.createElement('table'); //創建table標簽table.setAttribute('border',1); //設置table邊框// [{,name,pubdate,price,caption},]$.each(arg.data, function(k,v){ //循環data列表,里面是字典console.log(k); //k是data索引console.log(v); //v是data里面的字典//創建tr標簽var tr = document.createElement('tr');//根據后臺返回data里面的數組創建tdvar td1 = document.createElement('td');td1.innerText = v['name'];var td2 = document.createElement('td');td2.innerText = v['price'];var td3 = document.createElement('td');td3.innerText = v['book_type__caption'];var td4 = document.createElement('td');td4.innerText = v['pubdate'];//將所有td添加到trtr.appendChild(td1);tr.appendChild(td2);tr.appendChild(td3);tr.appendChild(td4);//將tr添加到tabletable.appendChild(tr);});$('.container').empty(); //顯示table前將內容清空container$('.container').append(table); //將后臺返回數據放在table里面添加到containerdiv顯示在前端}else{alert(arg.message);}}})}</script> </body> </html> HTMLHTML之重點:
1、var new_tag = $(ths).parent().clone()獲取的是通過jquery方法獲得的對象。
dom對象和jquery對象之間的轉換: #dom對象: document.getElementsById("i1")#jquery對象: $("i1")#dom對象轉換成jquery對象: $(document.getElementsByTagName("div")[0])#jquery對象轉換成dom對象 $("div").first()[0]?
views.py之重點:
?
轉載于:https://www.cnblogs.com/jl-bai/p/5798860.html
總結
- 上一篇: 让底部始终在浏览器底部
- 下一篇: CodeForces 703C Chri