欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python Web框架之Django框架Model基礎(chǔ)詳解

系統(tǒng) 1613 0

本文實(shí)例講述了Python Web框架之Django框架Model基礎(chǔ)。分享給大家供大家參考,具體如下:

model是關(guān)于你的數(shù)據(jù)的單一的,確定的信息來源。 它包含您正在存儲(chǔ)的數(shù)據(jù)的基本字段和行為。Django通過抽象化的模型層(models)為你的網(wǎng)絡(luò)應(yīng)用提供對(duì)于數(shù)據(jù)的結(jié)構(gòu)化處理和操作處理,數(shù)據(jù)庫相關(guān)的代碼一般寫在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等數(shù)據(jù)庫,使用數(shù)據(jù)庫API對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的操作。

使用哪種數(shù)據(jù)庫,只需要在settings.py中配置即可,如:

<1> sqlite : django默認(rèn)使用sqlite的數(shù)據(jù)庫,默認(rèn)自帶sqlite的數(shù)據(jù)庫驅(qū)動(dòng) , 引擎名稱: django.db.backends.sqlite3

<2> mysql :引擎名稱: django.db.backends.mysql

<3>如果想更改數(shù)據(jù)庫

            
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'books',  #你的數(shù)據(jù)庫名稱
    'USER': 'root',  #你的數(shù)據(jù)庫用戶名
    'PASSWORD': '', #你的數(shù)據(jù)庫密碼
    'HOST': '', #你的數(shù)據(jù)庫主機(jī),留空默認(rèn)為localhost
    'PORT': '3306', #你的數(shù)據(jù)庫端口
  }
}


          

注意事項(xiàng):

  • NAME即數(shù)據(jù)庫的名字,在mysql連接前該數(shù)據(jù)庫必須已經(jīng)創(chuàng)建,而上面的sqlite數(shù)據(jù)庫下的 db.sqlite3 則是項(xiàng)目自動(dòng)創(chuàng)建
  • USER和PASSWORD分別是數(shù)據(jù)庫的用戶名和密碼。
  • 設(shè)置完后,再啟動(dòng)我們的Django項(xiàng)目前,我們需要激活我們的mysql。
  • 然后,啟動(dòng)項(xiàng)目,會(huì)報(bào)錯(cuò): no module named MySQLdb
  • 這是因?yàn)閐jango默認(rèn)你導(dǎo)入的驅(qū)動(dòng)是MySQLdb,可是MySQLdb對(duì)于py3有很大問題,所以我們需要的驅(qū)動(dòng)是PyMySQL
  • 所以,我們只需要找到項(xiàng)目名文件下的 __init__ ,在里面寫入:
            
import pymysql
pymysql.install_as_MySQLdb()


          

Model 字段

AutoField ??????? 根據(jù)實(shí)際ID自動(dòng)增長的IntegerField . 你通常不需要直接使用;
??????????????? 如果不指定,一個(gè)主鍵字段將自動(dòng)添加到你創(chuàng)建的
BigIntegerField ??? 一個(gè)64位整數(shù), 類似于一個(gè) IntegerField 這個(gè)字段默認(rèn)的表單組件是一個(gè)TextInput.

IntegerField([**options])
一個(gè)整數(shù)。在Django所支持的所有數(shù)據(jù)庫中,從 -2147483648 到 2147483647 范圍內(nèi)的值是合法的。默認(rèn)的表單輸入工具是TextInput.

BinaryField? ?????? 用來存儲(chǔ)原始二進(jìn)制碼的Field. 只支持bytes 賦值,注意這個(gè)Field只有很有限的功能。
??????????????? 例如,不大可能在一個(gè)BinaryField 值的數(shù)據(jù)上進(jìn)行查詢
BooleanField ??? true/false 字段。默認(rèn)表單掛件是一個(gè)CheckboxInput.
??????????????? 如果你需要設(shè)置null 值,則使用NullBooleanField 來代替BooleanField。
??????????????? 如果Field.default沒有指定的話, BooleanField 的默認(rèn)值是 None。
CharField ??????? 一個(gè)用來存儲(chǔ)從小到很大各種長度的字符串的地方。
??????????????? 如果是巨大的文本類型, 可以用 TextField.
??????????????? 這個(gè)字段默認(rèn)的表單樣式是 TextInput.
??????????????? CharField必須接收一個(gè)額外的參數(shù):
??????????????? CharField.max_length:字段的最大字符長度.max_length將在數(shù)據(jù)庫層和Django表單驗(yàn)證中起作用, 用來限定字段的長度.

DateField ??????? 這是一個(gè)使用Python的datetime.date實(shí)例表示的日期. 有幾個(gè)額外的設(shè)置參數(shù):

??????????????? DateField.auto_now 每次保存對(duì)象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間。
??????????????? 用于"最后一次修改"的時(shí)間戳。注意,它總是使用當(dāng)前日期;它不只是一個(gè)默認(rèn)值,你可以覆蓋。

??????????????? DateField.auto_now_add??????? 當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間。用于創(chuàng)建時(shí)間的時(shí)間戳.
??????????????? 它總是使用當(dāng)前日期;和你可以覆蓋的那種默認(rèn)值不一樣。

??????????????? 該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput. 在管理員站點(diǎn)添加了一個(gè)JavaScript寫的日歷控件,
??????????????? 和一個(gè)“Today"的快捷按鈕.包含了一個(gè)額外的invalid_date錯(cuò)誤消息鍵.

??? DateTimeField(DateField) ??? - 日期+時(shí)間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

??? DateField(DateTimeCheckMixin, Field) ??? - 日期格式????? YYYY-MM-DD

??? TimeField(DateTimeCheckMixin, Field) - 時(shí)間格式????? HH:MM[:ss[.uuuuuu]]

DurationField(Field) 用作存儲(chǔ)一段時(shí)間的字段類型 - 類似Python中的timedelta.
??????????? - 長整數(shù),時(shí)間間隔,數(shù)據(jù)庫中按照bigint存儲(chǔ),ORM中獲取的值為datetime.timedelta類型

DecimalField(max_digits=None, decimal_places=None[, **options]) 表示十進(jìn)制浮點(diǎn)數(shù)

EmailField([max_length=254, **options]) 一個(gè) CharField 用來檢查輸入的email地址是否合法。它使用 EmailValidator 來驗(yàn)證輸入合法性。

FileField([upload_to=None, max_length=100) 一個(gè)上傳文件的字段。
FileField字段不支持primary_key 和unique參數(shù),如果使用會(huì)生成 TypeError錯(cuò)誤

FilePathField(path=None[, match=None, recursive=False, max_length=100])
一個(gè) CharField ,內(nèi)容只限于文件系統(tǒng)內(nèi)特定目錄下的文件名。有三個(gè)參數(shù), 其中第一個(gè)是 必需的:

FloatField([**options]) 用Python的一個(gè)float 實(shí)例來表示一個(gè)浮點(diǎn)數(shù).

ImageField([upload_to=None, height_field=None, width_field=None, max_length=100, **options])
繼承了 FileField的所有屬性和方法, 但還對(duì)上傳的對(duì)象進(jìn)行校驗(yàn),確保它是個(gè)有效的image.

TextField([**options]) 大文本字段。該模型默認(rèn)的表單組件是Textarea。

TimeField([auto_now=False, auto_now_add=False, **options])
時(shí)間字段,和Python中 datetime.time 一樣。接受與DateField相同的自動(dòng)填充選項(xiàng)。
表單默認(rèn)為 TextInput.輸入框。

URLField([max_length=200, **options]) 一個(gè)CharField 類型的URL此字段的默認(rèn)表單widget為TextInput。

UUIDField([**options]) 一個(gè)用來存儲(chǔ)UUID的字段。使用Python的UUID類。
當(dāng)使用PostgreSQL數(shù)據(jù)庫時(shí),該字段類型對(duì)應(yīng)的數(shù)據(jù)庫中的數(shù)據(jù)類型是uuid

字段選項(xiàng)(Field options)――參數(shù)

Field.null 如果為True,Django將在數(shù)據(jù)庫中將空值存儲(chǔ)為NULL。默認(rèn)值是 False。

Field.blank 如果為True,則該字段允許為空白。 默認(rèn)值是 False。

Field.choices 它是一個(gè)可迭代的結(jié)構(gòu)(比如,列表或是元組),
由可迭代的二元組組成(比如[(A, B), (A, B) ...]),用來給這個(gè)字段提供選擇項(xiàng)。
如果設(shè)置了 choices ,默認(rèn)表格樣式就會(huì)顯示選擇框,而不是標(biāo)準(zhǔn)的文本框,而且這個(gè)選擇框的選項(xiàng)就是 choices 中的元組。

Field.db_column 數(shù)據(jù)庫中用來表示該字段的名稱。如果未指定,那么Django將會(huì)使用Field名作為字段名.

Field.db_index 若值為 True, 則 django-admin sqlindexes 將會(huì)為此字段輸出 CREATE INDEX 語句。

Field.error_messages 能夠讓你重寫默認(rèn)拋出的錯(cuò)誤信息。通過指定 key 來確認(rèn)你要重寫的錯(cuò)誤信息。

Field.primary_key 若為 True, 則該字段會(huì)成為模型的主鍵字段。
如果你沒有在模型的任何字段上指定 primary_key=True, Django會(huì)自動(dòng)添加一個(gè) AutoField 字段來充當(dāng)主鍵。

Field.unique 如果為 True, 這個(gè)字段在表中必須有唯一值.

Field.unique_for_month 類似unique_for_date,只是要求字段對(duì)于月份是唯一的。

驗(yàn)證器

Field.validators 該字段將要運(yùn)行的一個(gè)Validator 的列表。

元信息Meta――使用內(nèi)部的class Meta 定義模型的元數(shù)據(jù)

            
from django.db import models
class Ox(models.Model):
horn_length = models.IntegerField()
class Meta:
ordering = ["horn_length"]
verbose_name_plural = "oxen"

          

模型元數(shù)據(jù)是“任何不是字段的數(shù)據(jù)”,比如排序選項(xiàng)(ordering),數(shù)據(jù)表名(db_table)或者人類可讀的單復(fù)數(shù)名稱(verbose_name 和verbose_name_plural)。

在模型中添加class Meta是完全可選的,所有選項(xiàng)都不是必須的。

關(guān)系字段

關(guān)系數(shù)據(jù)庫的威力體現(xiàn)在表之間的相互關(guān)聯(lián)。

Django 提供了三種最常見的數(shù)據(jù)庫關(guān)系:多對(duì)一(manyto-one),多對(duì)多(many-to-many),一對(duì)一(one-to-one)。

  • 多對(duì)一關(guān)系

Django 使用 django.db.models.ForeignKey 定義多對(duì)一關(guān)系。和使用其它字段類型一樣:在模型當(dāng)中把它做為一個(gè)類屬性包含進(jìn)來。

ForeignKey 需要一個(gè)位置參數(shù):與該模型關(guān)聯(lián)的類。

limit_choices_to 當(dāng)這個(gè)字段使用模型表單或者Admin 渲染時(shí)(默認(rèn)情況下,查詢集中的所有對(duì)象都可以使用),

為這個(gè)字段設(shè)置一個(gè)可用的選項(xiàng)。它可以是一個(gè)字典、一個(gè)Q 對(duì)象或者一個(gè)返回字典或Q對(duì)象的可調(diào)用對(duì)象。

??????? Q(caption='root')
??????? db_constraint=True????????? # 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束
??????? parent_link=False?????????? # 在Admin中是否顯示關(guān)聯(lián)數(shù)據(jù)

related_name ??? 這個(gè)名稱用于讓關(guān)聯(lián)的對(duì)象反查到源對(duì)象。它還是related_query_name 的默認(rèn)值(關(guān)聯(lián)的模型進(jìn)行反向過濾時(shí)使用的名稱)。

related_query_name ??? 這個(gè)名稱用于目標(biāo)模型的反向過濾。如果設(shè)置了related_name,則默認(rèn)為它的值,否則默認(rèn)值為模型的名稱

to_field 關(guān)聯(lián)到的關(guān)聯(lián)對(duì)象的字段名稱。默認(rèn)地,Django 使用關(guān)聯(lián)對(duì)象的主鍵。

db_constraint 控制是否在數(shù)據(jù)庫中為這個(gè)外鍵創(chuàng)建約束。默認(rèn)值為True

on_delete 當(dāng)一個(gè)ForeignKey 引用的對(duì)象被刪除時(shí),Django 默認(rèn)模擬SQL 的ON DELETE CASCADE 的約束行為,并且刪除包含該ForeignKey的對(duì)象。這種行為可以通過設(shè)置on_delete 參數(shù)來改變。

??? CASCADE 級(jí)聯(lián)刪除;默認(rèn)值。

??? PROTECT 拋出ProtectedError 以阻止被引用對(duì)象的刪除,它是django.db.IntegrityError 的一個(gè)子類。

??? SET_NULL 把ForeignKey 設(shè)置為null; null 參數(shù)為True 時(shí)才可以這樣做。

??? SET_DEFAULT ForeignKey值設(shè)置成它的默認(rèn)值;此時(shí)必須設(shè)置ForeignKey 的default 參數(shù)。

??? SET() 設(shè)置ForeignKey 為傳遞給SET() 的值,如果傳遞的是一個(gè)可調(diào)用對(duì)象,則為調(diào)用后的結(jié)果。
??? DO_NOTHING不采取任何動(dòng)作。如果你的數(shù)據(jù)庫后端強(qiáng)制引用完整性,它將引發(fā)一個(gè)IntegrityError ,除非你手動(dòng)添加一個(gè)ON DELETE 約束給數(shù)據(jù)庫自動(dòng)

ManyToManyField一個(gè)多對(duì)多關(guān)聯(lián)。

要求一個(gè)關(guān)鍵字參數(shù):與該模型關(guān)聯(lián)的類,與ForeignKey 的工作方式完全一樣,包括遞歸關(guān)系 和惰性關(guān)系。
關(guān)聯(lián)的對(duì)象可以通過字段的RelatedManager 添加、刪除和創(chuàng)建。

如果源模型和目標(biāo)不同,則生成以下字段:

id :關(guān)系的主鍵。

_id:聲明ManyToManyField 字段的模型的id。
_id:ManyToManyField 字段指向的模型的id。

如果ManyToManyField 的源模型和目標(biāo)模型相同,則生成以下字段:

id:關(guān)系的主鍵。
from_ _id:源模型實(shí)例的id。
to_ _id:目標(biāo)模型實(shí)例的id。

這個(gè)類可以讓一個(gè)給定的模型像普通的模型那樣查詢與之相關(guān)聯(lián)的記錄。

??? to,???????????????????????? # 要進(jìn)行關(guān)聯(lián)的表名
??? related_name=None,????????? # 反向操作時(shí),使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
??? related_query_name=None,??? # 反向操作時(shí),使用的連接前綴,用于替換【表名】???? 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
??? limit_choices_to=None,????? # 在Admin或ModelForm中顯示關(guān)聯(lián)數(shù)據(jù)時(shí),提供的條件:
??????? # 如:
??????????? - limit_choices_to={'nid__gt': 5}
??????????? - limit_choices_to=lambda : {'nid__gt': 5}

??????????? from django.db.models import Q
??????????? - limit_choices_to=Q(nid__gt=10)
??????????? - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
??????????? - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')

?? symmetrical=None,# 僅用于多對(duì)多自關(guān)聯(lián)時(shí),symmetrical用于指定內(nèi)部是否創(chuàng)建反向操作的字段
??????????????? # 做如下操作時(shí),不同的symmetrical會(huì)有不同的可選字段
??????????????????? models.BB.objects.filter(...)
??????????????????? # 可選字段有:code, id, m1
??????????????????????? class BB(models.Model):
??????????????????????? code = models.CharField(max_length=12)
??????????????????????? m1 = models.ManyToManyField('self',symmetrical=True)
??????????????????? # 可選字段有: bb, code, id, m1
??????????????????????? class BB(models.Model):
??????????????????????? code = models.CharField(max_length=12)
??????????????????????? m1 = models.ManyToManyField('self',symmetrical=False)
??????? through=None,?????????????? # 自定義第三張表時(shí),使用字段用于指定關(guān)系表
??????? through_fields=None,??????? # 自定義第三張表時(shí),使用字段用于指定關(guān)系表中那些字段做多對(duì)多關(guān)系表
??????????? from django.db import models
??????????? class Person(models.Model):
??????????????? name = models.CharField(max_length=50)
??????????? class Group(models.Model):
??????????????? name = models.CharField(max_length=128)
??????????????? members = models.ManyToManyField(
??????????????????? Person,
??????????????????? through='Membership',
??????????????????? through_fields=('group', 'person'),
??????????????? )
??????????? class Membership(models.Model):
??????????????? group = models.ForeignKey(Group, on_delete=models.CASCADE)
??????????????? person = models.ForeignKey(Person, on_delete=models.CASCADE)
??????????????? inviter = models.ForeignKey(
??????????????????? Person,
??????????????????? on_delete=models.CASCADE,
??????????????????? related_name="membership_invites",
??????????????? )
??????????????? invite_reason = models.CharField(max_length=64)
??????? db_constraint=True,???????? # 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束
??????? db_table=None,????????????? # 默認(rèn)創(chuàng)建第三張表時(shí),數(shù)據(jù)庫中表的名稱

OneToOneField

一對(duì)一關(guān)聯(lián)關(guān)系。概念上講,這個(gè)字段很像是ForeignKey 設(shè)置了unique=True,不同的是它會(huì)直接返回關(guān)系另一邊的單個(gè)對(duì)象。

它最主要的用途是作為擴(kuò)展自另外一個(gè)模型的主鍵;例如,多表繼承就是通過對(duì)子模型添加一個(gè)隱式的一對(duì)一關(guān)聯(lián)關(guān)系到父模型實(shí)現(xiàn)的。

需要一個(gè)位置參數(shù):與該模型關(guān)聯(lián)的類。 它的工作方式與ForeignKey 完全一致,包括所有與遞歸關(guān)系和惰性關(guān)系相關(guān)的選項(xiàng)。

以下內(nèi)容個(gè)人理解筆記:

            
    class News(models.Model):
      title = models.CharField(max_length=10)
      favor = models.ManyToManyField('User',through="Favor",through_fields=("new_obj", 'user_obj'))
# obj = models.News.objects.get(id=1)
# v = obj.favor.all()
# print(v)
# obj.favor.add(1)不能用
# obj.favor.remove(1)不能用
# v = obj.favor.all()能用
# obj.favor.clear()能用,根據(jù)id刪,不用name這個(gè)字段
# v = models.User.objects.all()
# v = models.User.objects.all().select_related('user_type')class User(models.Model):
      name = models.CharField(max_length=10)
      email = models.EmailField(max_length=10)
      user_type = models.ForeignKey('UserType') # 一對(duì)多
      # user_profile = models.ForeignKey('UserDetail',unique=True)
      user_profile = models.OneToOneField('UserDetail')
    class UserDetail(models.Model):
      pwd = models.CharField(max_length=32)
    class Favor(models.Model):
      new_obj = models.ForeignKey('News',related_name="n")
      user_obj = models.ForeignKey('User',related_name='u')
      name = models.CharField(max_length=64,null=True,blank=True)
    class UserType(models.Model):
      name = models.CharField(max_length=10)



          

訪問外鍵(Foreign Key)值

            
python manage.py shell


          

當(dāng)你獲取一個(gè)ForeignKey 字段時(shí),你會(huì)得到相關(guān)的數(shù)據(jù)模型對(duì)象。

            
>>> from django.db import connection
>>> from app01.models import User
>>> u=User.objects.get(id=1)
>>> u

            
              
>>> u.user_type

              
                
>>> u.user_type.name
'type1'


              
            
          

對(duì)于用ForeignKey 來定義的關(guān)系來說,在關(guān)系的另一端也能反向的追溯回來,
通過一個(gè)UserType對(duì)象,直接獲取 user ,用 UserType.user_set.all() ,

實(shí)際上,user_set 只是一個(gè) QuerySet(參考第5章的介紹),

所以它可以像QuerySet一樣,能實(shí)現(xiàn)數(shù)據(jù)過濾和分切,屬性名稱user_set是由模型名稱的小寫加_set組成的。

            
>>> from app01.models import UserType
>>> t=UserType.objects.get(name='type1')
>>> t.user_set.all()

            
              , 
              
                ]>


              
            
          
  • 多對(duì)多

正向查找

            
>>> from app01.models import News
>>> n=News.objects.get(id=1)
>>> n.favor.all()

            
              , 
              
                ]>
>>> n.favor.filter(name='nu1')

                
                  ]>


                
              
            
          

反向查找

            
>>> u.news_set.all()

            
              ]>


            
          

希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产成人免费无庶挡视频 | 日韩a在线看免费观看视频 五月天激情视频在线观看 成人97在线观看免费高清 | 污免费网站 | 99久久精品国产亚洲 | 精品久久久久久久久久 | 青青草国产 | 亚洲国产精品视频 | 天天干精品 | 亚洲精品久久久久久中文字幕小说 | 亚洲国产精品欧美综合 | sese综合| 91精品久久久久久久久久 | 久久久精品久久视频只有精品 | 99热久久这里只精品国产9 | 色狠狠xx| 午夜在线免费视频 | 二性视频 | 黄色资源在线观看 | 精品推荐国产麻豆剧传媒 | 欧美一a一片一级一片 | 日本xxww视频免费 | 成人不卡在线 | 99久久免费中文字幕精品 | 成人午夜在线视频 | 亚洲h| 精品一二区| 性强烈欧美一级毛片 | 精品国产三级在线观看 | 看中国毛片 | 国产福利小视频在线 | 日本黄色网址免费 | 国产后式a一视频 | 欧美精品18videosex性俄罗斯 | 免费一级毛片不卡在线播放 | 欧美91精品国产自产 | 亚洲线精品一区二区三区 | gogo全球大胆高清人露出91 | 91久久线看在观草草青青 | 成人偷拍片视频在线观看 | 91精品久久久久久久久网影视 | 麻豆短视频传媒网站怎么找 |