访问外键(ForeignKey)值:
当你访问一个外键属性时,获取的是一个数据模型对象
<span style="font-size:18px;"><span style="font-size:18px;">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 </span></span>
foreignkey关系也可以反推过来:
<span style="font-size:18px;"><span style="font-size:18px;">>>>p = Publisher.objects.get(pk=2)
>>>p.book_set.filter(title__icontains= 'python')
[<Book: python> <Book: python web>, <Book: python cookbook>]</span></span>
book_set实际上是一个queryset,因此它可以进行filter操作。book_set属性是由模型名的小写形式加上_set组成
访问ManyToManyField
我们处理的是一个queryset而不是一个数据模型
<span style="font-size:18px;"><span style="font-size:18px;">>>>b = Book.objects.get(pk=1)
<Book: python>
>>>b.author.all()
[<Author:joe>, <Author:jam>, <Author:Sam>]
>>>b.author.filter(name__icontains='am')
[<Author:jam>, <Author:Sam>]</span></span>
也可以通过book_set来查询一个作者的所有书籍
<span style="font-size:18px;"><span style="font-size:18px;">>>>a = Auhtor.objects.get(name='Sam')
>>>a.book_set.all()
</span></span>
Manager
模块manager是一个对象,Django通过它进行数据库查询。每个Django模块至少有一个manager,你可以自定义manager。增加manager额外的方法或者修改manager返回的初始的queryset
增加额外的方法
<span style="font-size:18px;"><span style="font-size:18px;">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()</span></span>
修改初始manager queryset
通过覆盖Manager的get_query_set()方法来修改初始的queryset
<span style="font-size:18px;">class BookManager(models.Manager):
def get_query_set(self):
return super(BookManager, self).get_query_set().filter(title__icontains='python')
<pre name="code" class="python"><span style="font-size:18px;">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的书</span> </span>
当有多个Manager时,Django默认使用第一个manager。
执行原始SQL查询
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app_book')
cursor.fetchall()