举例讲解Django中数据模型访问外键值的方法


Posted in Python onJuly 21, 2015

先设置一个关于书本(book)的数据模型:

from django.db import models

class Publisher(models.Model):
  name = models.CharField(max_length=30)
  address = models.CharField(max_length=50)
  city = models.CharField(max_length=60)
  state_province = models.CharField(max_length=30)
  country = models.CharField(max_length=50)
  website = models.URLField()

  def __unicode__(self):
    return self.name

class Author(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=40)
  email = models.EmailField()

  def __unicode__(self):
    return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
  title = models.CharField(max_length=100)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  publication_date = models.DateField()

  def __unicode__(self):
    return self.title

 访问外键(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一样,能实现数据过滤和分切,例如:

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.filter(name__icontains='django')
[<Book: The Django Book>, <Book: Pro Django>]

属性名称book_set是由模型名称的小写(如book)加_set组成的。

Python 相关文章推荐
跟老齐学Python之眼花缭乱的运算符
Sep 14 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
django之常用命令详解
Jun 30 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
python 中字典嵌套列表的方法
Jul 03 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
编写自定义的Django模板加载器的简单示例
Jul 21 #Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 #Python
剖析Django中模版标签的解析与参数传递
Jul 21 #Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 #Python
在Django的上下文中设置变量的方法
Jul 20 #Python
在Django中编写模版节点及注册标签的方法
Jul 20 #Python
在Python的Django框架中编写编译函数
Jul 20 #Python
You might like
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
JS常用知识点整理
2017/01/21 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
解读ES6中class关键字
2017/11/20 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python程序 创建多线程过程详解
2019/09/23 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
线程同步的方法
2016/11/23 面试题
大学四年学习的自我评价分享
2013/12/09 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
yy司仪主持词
2014/03/22 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书