django中models閱讀筆記


一、使用數據庫需要設置settings.py文件。

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
'ENGINE‘說明使用的是什么數據引擎,django中僅支持'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.這幾種。
 'NAME’使用哪個數據庫,在django中,框架可以生成數據表,但是不可以聲稱數據庫,所以要自己手動創建好數據庫。
'USER'數據庫的用戶名

2、如果django框架支持的操作滿足不了開發需求,可以執行原生的SQL語句。
>>> from django.db import connection
>>> cursor = connection.cursor()

3、常用的幾條命令:

python manage.py validate#檢查models是否有語法錯誤

python manage.py startproject projectname

python manage.py startapp appname

python manage.py syncdb#將新建的表創建到數據庫中,但是如果后期對表作了修改,在使用這條命令不會更新。此時應該使用下面兩條命令,僅在django版本》=1.7時使用

python manage.py makemigrations

python manage.py migrate

4、創建models

from django.db import models
from django.template.defaultfilters import default


class User(models.Model):
    name =models.CharField(max_length=50);
    createTime = models.DateTimeField(auto_now=True);
    updateTime = models.DateTimeField(auto_now_add=True);

5、當使用data=User.objects.all()方法時獲得的是數據表記錄對象的集合,我們可以使用一些有用的字符串來表示這些對象。可以添加一個類方法 __unicode__()

該方法返回一個代表該對象的字符串,是我們能夠看到他就知道是那一條記錄。

注意:該方法返回一個unicode對象,如果不是,比如數字,則返回一個TypeError

def __unicode__(self):
        return self.name

 6、使用User.objects.all()方法返回的數據是QuerySet對象,這個集合是由數據表中的記錄組成的集合。

 7、 將結果進行排序使用方法是order_by('name'),可以傳遞一個或多個參數。也可以按照逆序排列,只需要在列名前加一個減號-,例如order_by('-name')。

如果想要將查詢結果默認賦予按照某一列排序,有如下方法:

在models文件的類中添加

class Meta:
        ordering = ['name']

8、數據結果可以使用切片操作,但不可以使用負數。

Publisher.objects.order_by('name')[0:2]

Publisher.objects.order_by('name')[-1]

Traceback (most recent call last):

... AssertionError: Negative indexing is not supported.

 

9、QuerySet有update() 方法

Publisher.objects.all().update(country='USA')

10、刪除,使用對象的delete()方法,

>>> p = Publisher.objects.get(name="O'Reilly")

>>> p.delete()

>>> Publisher.objects.all()

[<Publisher: Apress Publishing>]

QuerySet也可以使用delete方法

 

>>> Publisher.objects.filter(country='USA').delete()
>>> Publisher.objects.all().delete()
>>> Publisher.objects.all()
[]

 

 11、獲取QuerySet數據對象的某一列數據使用'.'運算符例如:

對於數據表studentinfo:

class StudentInfo(models.Model):
    
    name = models.CharField(max_length = 50,default="");
    studentID = models.CharField(max_length=12,default="");
    sex = models.CharField(max_length = 5,default="");
    age = models.IntegerField(default=0);
    address = models.TextField(default="");

想要獲取name的值,

objs = StudentInfo.objects.get(studentID = id)#獲取QuerySet對象
objs.name#獲取name值

 

 12 自動添加當前時間到數據庫

時間域的三個類型DateTimeField和DateField和TimeField存儲的內容分別對應着datetime(),date(),time()三個對象。其中有兩個屬性比較重要auto_now=False和auto_now_add=False,默認情況下都是false。

auto_now=Ture,字段保存時會自動保存當前時間,但要注意每次對其實例執行save()的時候都會將當前時間保存,也就是不能再手動給它存非當前時間的值。

auto_now_add=True,字段在實例第一次保存的時候會保存當前時間,不管你在這里是否對其賦值。但是之后的save()是可以手動賦值的。也就是新實例化一個model,想手動存其他時間,就需要對該實例save()之后賦值然后再save()。

 

 13 字段中設置非必填項

有兩個參數可以設置,是blank和null

1)如果是字符串類型的字段,僅設置blank=True即可,當像數據庫中插入數據時,如果沒有提供值,django會自動添加空串到對應字段中。但是對於其他數據類型比如日期、數字等字段則這樣設置會出現錯誤。

2)如果是數字、日期等非字符串類型的字段,想讓他是非必填項,可以設置blank=True,null=True.此時相當於在sql語句中去除了NOT NULL屬性。

 

14 all():返回包含模式里所有數據庫記錄的QuerySet

filter():返回包含符合指定條件的模型記錄的QuerySet

exclude():和filter相反,查找不符合條件的querySet

get():獲取單個符合條件的記錄,沒有找到或者超過一個結果都會拋出異常。如果沒有則是DoesNotExist,如果是多個結果MultipleObjectsReturned

 

15 QuerySet是一個容器,類列表的容器,實現了一部分列表的接口,比如執行迭代、索引、切片以及獲取長度len。如果需要也可以使用list(QuerySet)轉換成列表。

 

 

 

 
 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM