码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-14 01:14:25      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:python django

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的数据

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

标签:python django

原文地址:http://wangyongbin.blog.51cto.com/8964308/1684496

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!