您的位置:首页 > 编程语言 > Go语言

Django 数据模型进阶

2016-03-13 20:52 405 查看
访问外键(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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: