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