Django 資料模型高階

2021-07-10 11:19:45 字數 3244 閱讀 8032

訪問外來鍵(foreignkey)值:

當你訪問乙個外來鍵屬性時,獲取的是乙個資料模型物件

models.py

from django.db import models

class publisher(models.model):

name = models.charfield(max_length=50)

website = models.charfield(max_length=60)

def __unicode__(self):

return self.name

class author(models.model):

name = models.charfield(max_length=50)

email = models.emailfield()

def __uniclde__(self):

return self.name

class book(models.model):

title = models.charfield(max_length=50)

publisher = models.foreignkey(publisher)

author = models.manytomanyfield(author)

pub_date = models.datetimefield()

>>> from models import *

>>>b = book.objects.get(pk=3)

>>>b.publisher

>>>b.publisher.name

foreignkey關係也可以反推過來:

>>>p = publisher.objects.get(pk=2)

>>>p.book_set.filter(title__icontains= 'python')

[, ]

book_set實際上是乙個queryset,因此它可以進行filter操作。book_set屬性是由模型名的小寫形式加上_set組成

訪問manytomanyfield

我們處理的是乙個queryset而不是乙個資料模型

>>>b = book.objects.get(pk=1)

>>>b.author.all()

[, , ]

>>>b.author.filter(name__icontains='am')

[, ]

也可以通過book_set來查詢乙個作者的所有書籍
>>>a = auhtor.objects.get(name='sam')

>>>a.book_set.all()

manager

模組manager是乙個物件,django通過它進行資料庫查詢。每個django模組至少有乙個manager,你可以自定義manager。增加manager額外的方法或者修改manager返回的初始的queryset

增加額外的方法

models.py

from django.db import models

class publisher(models.model):

name = models.charfield(max_length=50)

website = models.charfield(max_length=60)

def __unicode__(self):

return self.name

class author(models.model):

name = models.charfield(max_length=50)

email = models.emailfield()

def __uniclde__(self):

return self.name

class bookmanager(models.manager):

def title_count(self, keyword):

return self.filter(title=keyword).count()

class book(models.model):

title = models.charfield(max_length=50)

publisher = models.foreignkey(publisher)

author = models.manytomanyfield(author)

pub_date = models.datetimefield()

objects = bookmanager()

修改初始manager queryset

通過覆蓋manager的get_query_set()方法來修改初始的queryset

class bookmanager(models.manager):

def get_query_set(self):

return super(bookmanager, self).get_query_set().filter(title__icontains='python')class book(models.model):

title = models.charfield(max_length=50)

publisher = models.foreignkey(publisher)

author = models.manytomanyfield(author)

pub_date = models.datetimefield()

objects = models.manager()

classify_objects = bookmanager()

>>>book.objects.all() #獲取所有書籍

>>>book.classify_objects.all() #獲取所有title中包含python的書

當有多個manager時,django預設使用第乙個manager。

執行原始sql查詢

from django.db import connection

cursor = connection.cursor()

cursor.fetchall()

概念資料模型 邏輯資料模型 物理資料模型

概念資料模型設計與邏輯資料模型設計 物理資料模型設計是資料庫及資料倉儲模型設計的三個主要步驟。在資料倉儲領域有乙個概念叫conceptual data model,中文一般翻譯為 概念資料模型 概念資料模型是終端使用者對資料儲存的看法,反映了終端使用者綜合性的資訊需求,它以資料類的方式描述企業級的資...

概念資料模型,邏輯資料模型,物理資料模型

在資料倉儲領域有乙個概念叫conceptual data model,中文一般翻譯為 概念資料模型 概念資料模型是終端使用者對資料儲存的看法,反映了終端使用者綜合性的資訊需求,它以資料類的方式描述企業級的資料需求,資料類代表了在業務環境中自然聚集成的幾個主要類別資料。概念資料模型的內容包括重要的實體...

Django 資料模型欄位及屬性

autofield 乙個能夠根據可用id自增的 integerfield booleanfield 乙個真 假 true false 字段 charfield max length 乙個字串字段,適用於中小長度的字串。對於長段的文字,請使用 textfield commaseparatedinteg...