Django 数据模型进阶
来源:互联网 发布:王师傅知乎 编辑:程序博客网 时间:2024/06/08 18:59
访问外键(ForeignKey)值:
当你访问一个外键属性时,获取的是一个数据模型对象
<span style="font-size:18px;"><span style="font-size:18px;">models.pyfrom django.db import modelsclass Publisher(models.Model): name = models.CharField(max_length=50) website = models.CharField(max_length=60) def __unicode__(self): return self.nameclass Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __uniclde__(self): return self.nameclass 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.pyfrom django.db import modelsclass Publisher(models.Model): name = models.CharField(max_length=50) website = models.CharField(max_length=60) def __unicode__(self): return self.nameclass Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __uniclde__(self): return self.nameclass 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 connectioncursor = connection.cursor()cursor.execute('select * from app_book')cursor.fetchall()
0 0
- Django 数据模型进阶
- 【django 学习笔记】09-数据模型高级进阶
- The Django Book 2.0--中文版--第十章: 数据模型高级进阶
- Django进阶
- Django进阶
- Django中models数据模型重命名
- Django 数据模型字段及属性
- Django 数据模型增删改查
- Django学习笔记之【应用和数据模型】
- Django 数据模型的字段列表整理
- Django的ORM数据模型的反向关系
- Django 数据模型的字段列表整理
- django 数据模型管理工具south的使用方法详述
- Django 根据数据模型models创建数据表
- 第10章: 数据模型高级进阶
- Django admin进阶
- python之类-django进阶
- django进阶 - 用户信息扩展
- CodeForces #4B. Before an Exam
- 基于python利用爬虫爬取网页教程
- 剑指offer-反转链表
- MySQL数据库总结(8)字符集与校对集
- Object-C学习笔记——内存管理
- Django 数据模型进阶
- C语言指针函数链表复习
- Android MainActivity如何加载BaseActivity的布局
- 1500: [NOI2005]维修数列
- HBASE---数据存储实践
- 第三周项目4:穷举法解决组合问题
- 自定义Log
- FastSocket.Net
- 文章标题