日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Django 模型(數(shù)據(jù)庫)

 小飛苑 2017-01-08

Django 模型是與數(shù)據(jù)庫相關(guān)的,與數(shù)據(jù)庫相關(guān)的代碼一般寫在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等數(shù)據(jù)庫,只需要在settings.py中配置即可,不用更改models.py中的代碼,豐富的API極大的方便了使用。

本節(jié)的代碼:(Django 1.6, Python 2.7 測試環(huán)境)

learn_models.zip

大家可以按照我的步驟來開始做:

django-admin.py startproject learn_models # 新建一個項目
cd learn_models # 進(jìn)入到該項目的文件夾
django-admin.py startapp people # 新建一個 people 應(yīng)用(app)

補(bǔ)充:新建app也可以用 python manage.py startapp people, 需要指出的是,django-admin.py 是安裝Django后多出的一個命令,并不是指一個 django-admin.py 腳本在當(dāng)前目錄下。

那么project和app什么關(guān)系呢,一個項目一般包含多個應(yīng)用,一個應(yīng)用也可以用在多個項目中。


將我們新建的應(yīng)用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這么一個應(yīng)用。

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'people',
)

我們打開 people/models.py 文件,修改其中的代碼如下:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

我們新建了一個Person類,繼承自models.Model, 一個人有姓名和年齡。這里用到了兩種Field,更多Field類型可以參考教程最后的鏈接。


我們來同步一下數(shù)據(jù)庫(我們使用默認(rèn)的數(shù)據(jù)庫 SQLite3,無需配置)

python manage.py syncdb # 進(jìn)入 manage.py 所在的那個文件夾下輸入這個命令

注意:Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

我們會看到,Django生成了一系列的表,也生成了我們新建的people_person這個表,那么如何使用這個表呢?

Django提供了豐富的API, 下面演示如何使用它。

$ python manage.py shell

>>> from people.models import Person
>>> Person.objects.create(name="WeizhongTu", age=24)
<Person: Person object>
>>>

我們新建了一個用戶WeizhongTu 那么如何從數(shù)據(jù)庫是查詢到它呢?

>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>

我們用了一個 .objects.get() 方法查詢出來符合條件的對象,但是大家注意到了沒有,查詢結(jié)果中顯示<Person: Person object>,這里并沒有顯示出與WeizhongTu的相關(guān)信息,如果用戶多了就無法知道查詢出來的到底是誰,查詢結(jié)果是否正確,我們重新修改一下 people/models.py

name 和 age 等字段中不能有 __(雙下劃線,因為在Django QuerySet API中有特殊含義(用于關(guān)系,包含,不區(qū)分大小寫,以什么開頭或結(jié)尾,日期的大于小于,正則等)

也不能有Python中的關(guān)鍵字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因為它是Python的關(guān)鍵字( import keyword; print(keyword.kwlist) 可以打出所有的關(guān)鍵字)

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    
    def __unicode__(self):
    # 在Python3中使用 def __str__(self)
        return self.name

按CTRL + C退出當(dāng)前的Python shell, 重復(fù)上面的操作,我們就可以看到:

新建一個對象的方法有以下幾種:

  1. Person.objects.create(name=name,age=age)

  2. p = Person(name="WZ", age=23)

    p.save()

  3. p = Person(name="TWZ")

    p.age = 23

    p.save()

  4. Person.objects.get_or_create(name="WZT", age=23)

    這種方法是防止重復(fù)很好的方法,但是速度要相對慢些,返回一個元組,第一個為Person對象,第二個為True或False, 新建時返回的是True, 已經(jīng)存在時返回False.


獲取對象有以下方法:

  1. Person.objects.all()

  2. Person.objects.all()[:10] 切片操作,獲取10個人,不支持負(fù)索引,切片可以節(jié)約內(nèi)存

  3. Person.objects.get(name=name)


    get是用來獲取一個對象的,如果需要獲取滿足條件的一些人,就要用到filter

  4. Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴(yán)格等于 "abc" 的人

  5. Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區(qū)分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件


  6. Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人

  7. Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區(qū)分大小寫


  8. Person.objects.filter(name__regex="^abc") # 正則表達(dá)式查詢

  9. Person.objects.filter(name__iregex="^abc")# 正則表達(dá)式不區(qū)分大小寫


    filter是找出滿足條件的,當(dāng)然也有排除符合某條件的

  10. Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象

  11. Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23歲的


參考文檔:

Django models 官方教程: https://docs./en/dev/topics/db/models/

Fields相關(guān)官方文檔:https://docs./en/dev/ref/models/fields/

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多