在app的models.py文件中建立模型:python
from django.db import models class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=255) publish = models.CharField(max_length=255) author = models.CharField(max_length=255) price = models.DecimalField(max_digits=5,decimal_places=2) date = models.DateField()
更多字段和參數:mysql
1.字段:git
AutoField(Field) #當model中若是沒有自增列,則會自動建立一個列名爲id的列 -int 自增列,必須填入參數primary_key=True SmallIntegerField(IntegerField): - 小整數 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整數 0 ~ 32767 IntegerField(Field) - 整數列(有符號的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整數 0 ~ 2147483647 BigIntegerField(IntegerField): - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布爾值類型 NullBooleanField(Field): - 能夠爲空的布爾值 CharField(Field) - 字符類型 - 必須提供max_length參數, max_length表示字符長度 TextField(Field) - 文本類型 EmailField(CharField): - 字符串類型,Django Admin以及ModelForm中提供驗證機制 IPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制 GenericIPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6 - 參數: protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓刺功能,須要protocol="both" URLField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證 URL SlugField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號) CommaSeparatedIntegerField(CharField) - 字符串類型,格式必須爲逗號分割的數字 UUIDField(Field) - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能 - 參數: path, 文件夾路徑 match=None, 正則匹配 recursive=False, 遞歸下面的文件夾 allow_files=True, 容許文件 allow_folders=False, 容許文件夾 FileField(Field) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) DateTimeField(DateField) - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 時間格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型 FloatField(Field) - 浮點型 DecimalField(Field) - 10進制小數 - 參數: max_digits,小數總長度 decimal_places,小數位長度 BinaryField(Field) - 二進制類型
2.參數sql
1.null 若是未True,Django將用NULL來在數據庫中存儲空值,默認爲false 2.blank 若是未True,該字段容許爲空,默認爲False。 注:與null不一樣。null是數據庫範疇,blank是數據驗證 3.default 字段默認值 4.primary_key 若是未True,那麼這個字段就是模型的主鍵。若是沒有指定,Django會自動添加一個IntegerField字段做爲主鍵 5.unique 該字段的值在表中惟一 6.choices 由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 若是設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,<br>並且這個選擇框的選項就是choices 中的選項。
元信息:數據庫
class UserInfo(models.Model): nid = models.AutoField(primary_key=True) username = models.CharField(max_length=32) class Meta: # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名 db_table = "table_name" # 聯合索引 index_together = [ ("pub_date", "deadline"), ] # 聯合惟一索引 unique_together = (("driver", "restaurant"),) # admin中顯示的表名稱 verbose_name # verbose_name加s verbose_name_plural
setting配置:django
若是想要將模型轉爲mysql數據庫中的表,須要在setting中配置:app
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123456' } } ''' 'NAME':要鏈接的數據庫,鏈接前須要建立好 'USER':鏈接數據庫的用戶名 'PASSWORD':鏈接數據庫的密碼 'HOST':鏈接主機,默認本機 'PORT':端口 默認3306 'ATOMIC_REQUEST': True, 設置爲True統一個http請求對應的全部sql都放在一個事務中執行(要麼全部都成功,要麼全部都失敗)。 是全局性的配置, 若是要對某個http請求放水(而後自定義事務),能夠用non_atomic_requests修飾器 'OPTIONS': { "init_command": "SET storage_engine=MyISAM", } 設置建立表的存儲引擎爲MyISAM,INNODB '''
而後,啓動項目,會報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb 對於py3有很大問題,因此咱們須要的驅動是PyMySQL 因此,咱們只須要找到項目名文件下的__int__,在裏面寫入:atom
import pymysql pymysql.install_as_MySQLdb()
最後經過兩條數據庫遷移命令便可在指定的數據庫中建立表:spa
python35 manage.py makemigrathons
python35 manage.py migrate
注意:rest
1.數據庫遷移記錄都在app下的migrations中 2.使用showmigration命令能夠查看沒有執行migrate的文件 3.makemigrations是生成一個文件,migrate是將更改提交到數據庫
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "book.settings") import django django.setup() from app01 import models book = models.Book.objects.create(name='python全棧',author='egon',publish='老男孩出版',price='78.2',date='2018-1-1') print(book)
方式一:返回結果是一個對象
# create方法的返回值book_obj就是插入book表中的紅樓夢這本書籍紀錄對象 book_obj=models.Book.objects.create(name='紅樓夢',price=23.8,publish='人民出版社',author='曹雪芹',create_data='2018-09-17')
方式二:先實例化產生對象,而後調用save方法保存
book_obj=models.Book(name='水滸傳',price=99,publish='清華出版社',author='施耐庵',create_data='2017-09-17') book_obj.save()
方式一:
ret=models.Book.objects.filter(name='紅樓夢').delete() # ret返回的是被影響行數,queryset對象的.delete()方法 若是存在多本紅樓夢將會被所有刪除
方式二:
ret=models.Book.objects.filter(name='紅樓夢').first() ret.delete() 只刪除一個
注:刪除前應先查詢
方式一:
ret=models.Book.objects.filter(name='紅樓夢').update(price=20.9)
方式二:
對象沒有update方法,可是能夠用save來修改 book=models.Book.objects.filter(name='紅樓夢').first() book.price=33 book.save()
1.all() 查詢全部結果 models.Book.objects.all() 2.filter(**kwargs) 指定條件查詢 filter內可傳多個參數,逗號分隔,他們之間是and關係 models.Book.objects.filter(name='紅樓夢').first() 或者models.Book.objects.filter(name='紅樓夢')[0] 注:不支持負數 3.get(**kwargs) 有且只有一個結果,返回的是對象,不是queryset對象,一般使用id查詢 ret=Book.objects.get(name='紅樓夢') 不存在或超過一個會報錯 4.exclude(**kwargs) 返回與篩選對象不匹配的對象 models.Book.objects.exclude(price>40) 5.order_by() 對查詢結果排序 models.Book.objects.all().order_by('price') 默認升序 倒序:models.Book.objects.all().order_by('-price') 能夠傳多個參數,逗號隔開。 6.reverse() 對查詢結果反向排序 7.count()查詢結果的個數 8.first()返回第一條記錄 last()返回最後一條記錄 9.exists()若是queryset包含數據就返回True,不然返回False models.Book.objects.filter(name='紅樓夢').exists() 10.values() queryset對象裏套字典 11.values_list() 返回元組序列,values返回的是一個字典序列 12.distinct()從結果中剔除重複記錄 ----------------------------------------------------------- 基於雙下劃線的模糊查詢 1.大於__gt models.Book.objects.filter(price__gt='89') 2.小於__lt= models.Book.objects.filter(price__lt='99') 3.小於等於__lte= models.Book.objects.filter(price__lte='99') 4.大於等於__gte models.Book.objects.filter(price__gte='89') 5.in在XX中 ret=models.Book.objects.filter(price__in=['23.8','89','100']) 6.range 在xx範圍內 between and ret=models.Book.objects.filter(price__range=[50,100]) 7.contains 查詢名字帶有 紅 字的書 models.Book.objects.filter(name__contains='紅') 8.icontains 查詢名字帶p的書,忽略大小寫 models.Book.objects.filter(name__icontains='P') 9.startswith 以XX開頭 models.Book.objects.filter(name__startswith='紅') 10.endwith 以xx結尾 models.Book.objects.filter(name__endwith='夢') 11.__year按年查詢 models.Book.objects.filter(create_data_year='2018')