django book学习笔记——模型高级进阶

1.访问外键(Foreign Key)值

当你获取一个为ForeignKey 字段时,你会得到相关的数据模型对象. 例如:

>>> b = Book.objects.get(id=50)
>>> b.publisher
<Publisher: Apress Publishing>
>>> b.publisher.website
u‘http://www.apress.com/‘

对于用 ForeignKey 来定义的关系来说,在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。 通过一个 publisher 对象,直接获取 books ,用
publisher.book_set.all() ,如下:

>>> p = Publisher.objects.get(name=‘Apress Publishing‘)
>>> p.book_set.all()
[<Book: The Django Book>, <Book: Dive Into Python>, ...]

实际上,book_set 只是一个 QuerySet,所以它可以像QuerySet一样,能实现数据过滤和分切。属性名称book_set是由模型名称的小写(如book)加_set组成的。

2.访问多对多值

多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。 例如:

>>> b = Book.objects.get(id=50)
>>> b.authors.all()
[<Author: Adrian Holovaty>, <Author: Jacob Kaplan-Moss>]
>>> b.authors.filter(first_name=‘Adrian‘)
[<Author: Adrian Holovaty>]
>>> b.authors.filter(first_name=‘Adam‘)
[]

反向就像使用 ForeignKey字段。

3.更改数据库模式

我们注意到 syncdb 只仅仅创建数据库里还没有的数据表,它 并不 对你的数据模型修改进行同步,也不处理数据模型里的删除.
如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要自己手动在数据库里进行相应的修改。

当处理模型修改的时候,将Django的数据库层的工作流程铭记于心是很重要的。

  • 如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。
    当你第一次用Django的数据库API来请求不存在的表会导致错误的。(例如,它会在运行期出错,而不是编译期)
  • Django关心数据库的表格中是否存在未在模型中定义的列。
  • Django关心数据库中是否存在未被模型表示的表格。

4.Managers

1).增加额外的Manager方法

增加额外的manager方法是为模块添加表级功能的首选办法。例如,我们为Book模型定义了一个title_count()方法:

# models.py

from django.db import models

# ... Author and Publisher models here ...

class BookManager(models.Manager):
    def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    num_pages = models.IntegerField(blank=True, null=True)
    objects = BookManager()

    def __unicode__(self):
        return self.title

2).修改初始Manager QuerySets

我们可以通过覆盖Manager.get_query_set()方法来覆盖manager的基本QuerySet.
get_query_set()按照你的要求返回一个QuerySet。

# models.py

from django.db import models

class DahlBookManager(models.Manager):
    def get_query_set(self):
        return super(DahlBookManager,self).get_query_set().filter(authors=‘2‘)  
        #Roald Dahl  id=2    查询外键,ManyTOMany字段时好像只能通过id查询

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    num_pages = models.IntegerField(blank=True,null=True)
    objects = models.Manager()
    dahl_objects = DahlBookManager()

    def __unicode__(self):
        return self.title

在这个示例模型中,Book.objects.all()返回了数据库中的所有书本,而Book.dahl_objects.all()只返回了作者id为2的数据

时间: 2024-12-25 17:12:51

django book学习笔记——模型高级进阶的相关文章

django book学习笔记——模板高级进阶

1.RequestContext和Context处理器 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext .例如: from django.template import loader, RequestContext def custom_proc(request):     "A context processor that provides 'app', 'user' and 'ip_address'."     return {     

django book学习笔记——模型

1.数据库配置 打开settings.py配置文件,找到数据库配置DATABASES,例如: DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql', # 使用哪个数据库引擎         'NAME': 'djangodb',                      # 数据库名称         'USER': 'django',                      # 用哪个用户连接数

django1.8读书笔记模型高级进阶

一.访问外键和多对多值 例如:模型类定义如下 from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30

Hadoop学习笔记(7) ——高级编程

Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2.映射(map):根据输入的<key, value>进生处理, 3.合并(combiner):合并中间相两同的key值. 4.分区(Partition):将<key, value>分成N分,分别送到下一环节. 5.化简(Reduce):将中间结

APUE 学习笔记(九) 高级I/O

1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2)如果数据不能立即被(1)中文件类型接受,则写操作会使调用者永远阻塞 (3)某些进程间通信函数 非阻塞I/O使我们可以调用open.read.write这样的I/O操作,并使这些操作不会永远阻塞,如果这种操作不能完成,则调用立即出错返回 对于一个给定的文件有两种方法对其指定非阻塞I/O: (1)调用

APUE 学习笔记(十) 高级I/O

1. Unix IPC(InterProcess Communication) 同一主机的各个进程间的IPC:管道.FIFO.消息队列.信号量.共享存储器 不同主机上的各个进程间IPC:socket套接字 2. 管道 管道进行IPC有两个局限: (1) 半双工,即数据只能在一个方向上流动 (2) 只能在具有公共祖先的进程之间使用.通常,一个管道由一个进程创建,然后该进程调用fork,此后 父子进程之间可以使用该管道 fstat函数对管道的每一端都返回一个FIFO类型的文件描述符,可以用S_ISF

Linux System Programming 学习笔记(四) 高级I/O

1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and multiple buffers This type of I/O is so named because the data is scattered into or gathered from the given vector of buffers Scatter/Gather I/O 相比于 C标准

django book学习笔记——高级视图和URL配置

1.URLconf技巧 1).流线型化函数导入 在 URLconf 中的每一个入口包括了它所联系的视图函数,直接传入了一个函数对象. 这就意味着需要在模块开始处导入视图函数.但随着 Django 应用变得复杂,它的 URLconf 也在增长,并且维护这些导入可能使得管理变麻烦. 为了避免这种麻烦,Django 提供了一种方法可以在 URLconf 中为某个特别的模式指定视图函数: 你可以传入一个包含模块名和函数名的字符串,而不是函数对象本身.例如: from django.conf.urls.d

Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101

MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method属性值是get,如果看到表单没有写method属性那就是表示method是get方式提交.另外一种就是post方式. 当使用HTTP Get请求时,浏览器会提取表单中元素的name特性值及相应的value特性值放到查询字符串中.如:http://localhost?search?id=1 如果不想把