关于DJANGO MODELS的个人理解和RELATED_NAME的使用
作为一个新人(刚刚大学还没有毕业就出来实习,可以说是真的什么都不知到,什么都要重新学,但是这样真的可以锻炼自己的意志力和能力)。现在在公
司是前端和后端一起坐,所以要学的东西是真的多的让人想不到。在学习的过程中也越到了不少的问题,今天和大家分享一下django中的models的一些知识,
有不对或者不当的地方希望大家可以指正,大家共同学习,共同进步,在此谢过!
相信做程序的大家都是知道的,关系数据库的强大不仅仅是由于用数据库可以存放数据,更重要的是他可以存放数据库中表与表之间的关系,Django请
提供了三种最为通用的数据库关系模型
1 mang-to-many(对对多关系)
2 many-to-one(多对一关系)
3 one-to-one(一对一关系)
一,多对一关系:
用 ForeignKey 来定义多对一的关系。用法和其他的 Field 是一样的,把它放到模型中类的属性定义中就行了。ForeignKey 需要一个与之相关联的类作为
位置参数。在这里我用django book中的一个比较经典的实例来和大家一起分享一下:首先,定义了三个模型分别为:Publisher(出版商),Author(作者)和Book(书)
1 class Publisher(models.Model):2 name = models.CharField(max_length=30)3 address = models.CharField(max_length=50)4 city = models.CharField(max_length=60)5 state_province = models.CharField(max_length=30)6 country = models.CharField(max_length=50)7 website = models.URLField()8 def __unicode__(self):9 return self.name 10 11 12 class Meta: 13 ordering = ['name'] 14 15 16 class Author(models.Model): 17 first_name = models.CharField(max_length=30) 18 last_name = models.CharField(max_length=40) 19 email = models.EmailField(blank=True) 20 def __unicode__(self): 21 return u'%s %s' % (self.first_name, self.last_name) 22 23 24 class Book(models.Model): 25 title = models.CharField(max_length=100) 26 authors = models.ManyToManyField(Author) 27 publisher = models.ForeignKey(Publisher, related_name = "publisher_set") 28 publication_date = models.DateField(blank=True, verbose_name='e-mail') 29 num_pages = models.IntegerField(blank=True, null=True) 30 # objects = BookManager() 31 objects = models.Manager() # The default manager. 32 dahl_objects = DahlBookManager() # The Dahl-specific manager 33 34 # . 35 def __unicode__(self): 36 return self.title
要建立一个递归的关系,即一个对象和自身的多对一关系,你可以这样写:models.ForeignKey('self') :
1 class Employee(models.Model): 2 manager = models.ForeignKey('self')
如果你创建关系时,所需的模型还没有被定义,你可以不使用模型对象本身,而是使用那个模型的名字。
1 class Car(models.Model): 2 manufacturer = models.ForeignKey('Manufacturer') 3 ... 4 class Manufacturer(models.Model):
但是,你要记住,只能对在同一个 models.py 文件中的模型使用字符串引用,对于其他应用程序中的模型或者从其他地方导入
的模型是不能使用名字对其做引用的。
Django在数据库中使用的列名称是对应的字段的名称后追加 _id 得到的字符串。再前面的那个例子中, Car 模型对应的数据库
表中会有一个名字是 manufacturer_id 的列,(你可以通过指定 db_column 来显式改变这个名字,参见前面
的db_column一节)但是,如果你不需要写定制的SQL语句的话,你永远不要去处理数据库列名,只需要处理你的模型对象中的
字段名称。
在这里有几个概念要讲清楚,当初我就是载在这上面的,希望有同感的朋友可以看到,ForeignKey选项
1.edit_inline:
如果不设为 False 的话,它对应的对象就可以在页面上内联编辑,就是说这个对象有自 己独立的
管理界面。如果设为 models.TABULAR 或者 models.STACKED 的话,这个内 联编辑对象分别显
示成一个表格或者一些字段的集合。
2.limit_choices_to:
可以限定对象的值的范围的一个参数和值的字典。结合Python的 datetime 模块的
函数可以根据日期来限定对象。例如,下面的代码:
limit_choices_to = {'pub_date__lte': datetime.now}
把可选对象限定到 pub_date 早于当前时间的对象中。
除字典外,这里也可以是一个可以执行更复杂的查询的 Q 对象
这个选项和 edit_inline 是不兼容的。
于内联编辑对象,这个是要在管理界面里显示的相关对象的最多个数。所以,如果披萨最多 只会
有10种配料, max_num_in_admin=10 会保证用户最多输入10种配料。
记住,本项并不保证不会创建10种以上的配料,他只是控制管理界面,而不是在Python的API 层和
数据库层做什么限制。
4.min_num_in_admin
在管理界面中要显示的相关的对象的最少个数。通常,在创建的时候,显示的内联对象的个数 为
num_in_admin 个,在编辑的时候,在当前的基础上又会多显示 num_extra_on_change 个空对
象,但是显示的对象个数不会少于 min_num_in_admin 个。
5.num_extra_on_change
修改对象时要额外显示的对象数目。
6.num_in_admin
添加对象时要显示的内联对象的默认个数。
7.raw_id_admin
为要键入的整数显示一个文本框,而不是一个下拉列表。在关联对象有很多行时,这个比显示 一个
列表选择框更实用。
使用 edit_inline 时,本项无效。
8.related_name
关联对象反向引用描述符。
9.to_field
关联对象的用于关联的字段,Django默认使用关联对象的主键。
要学习ForeignKey并了解深刻的话,可以先对以上ForeignKey的这些选项有一定的了解。这样可以加深你对ForeignKey的印象。
万事俱备,现在,假如你想通过Book这张表去访问Publisher和Author都是可以直接访问的,因为Book这张表中有外键和这两张
表关联,因此可以直接通过语句去访问Book和Publisher表。
1 def get_info(request, id): 2 books = Book.objects.filter(publisher__id = id).all() 3 return render_to_response("showdb_info.html",{ 4 "books": books 5 }, 6 context_instance=RequestContext(request))
这一步相信大家都是知道的,即使不知道,等你看了笔者的这篇博客之后肯定也会一目了然的。但是,假如反过来该怎么去查询呢?
(通过Publisher或者Author表查询Book表中的内容)在这里就要用到一个相当重要的ForeignKey选项,通过该选项你可以随便访问Books
中的任意字段。
def get_book_info(request, id):publisher = Publisher.objects.filter(publisher_set__id = id)return render_to_response("showdb_info.html",{"publisher": publisher,},context_instance=RequestContext(request))
以上python函数中的都是伪代码,有兴趣的读者可以自己设计自己的代码。此文将会持续更新,有意者可以持续关注,欢迎大家指正不足!
转载于:https://www.cnblogs.com/eternal1025/p/9244090.html
关于DJANGO MODELS的个人理解和RELATED_NAME的使用相关推荐
- Django models模型
Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成p ...
- django models 之字段详解
数据库模型是django操作数据库的主要途径,也是django和数据库连接的主要方法,几乎所有对数据库的操作都是通过models来完成的,下面我们就简单介绍一下创建模型时会涉及到的字段类型, ...
- Django models Form model_form 关系及区别
Django models Form model_form 转载于:https://www.cnblogs.com/hellojesson/p/6234636.html
- Django models的诡异异常RelatedObjectDoesNotExist
Django models的诡异异常RelatedObjectDoesNotExist 参考文章: (1)Django models的诡异异常RelatedObjectDoesNotExist (2) ...
- How to manage concurrency in Django models
How to manage concurrency in Django models The days of desktop systems serving single users are long ...
- django models 配置
一, 使用已有视图 场景: 项目中用到了一个视图:DT_users 对应的django models.py配置为: class DT_users(models.Model):...class Meta ...
- Django models 筛选不等于
Django models 筛选不等于 目前的查询 j = Job.objects.filter(status="0").all() 筛选不等于 0 并不能用如下写法 j = Jo ...
- Django Abstract Models使用下划线设置related_name
前言 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895,817, 687 有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 我有一个 ...
- 00x: Django models.Model详解
Models model是对于信息的一种模型封装与定义.它包含了你要存储的必要字段和操作数据的方法.一句话概括就是,每个模型映射了一张数据表. 基本概念: 每个model都是继承于django.db. ...
最新文章
- Android开发工具
- Linux7 下重新安装YUM
- python小项目实例流程-公司内项目对接钉钉审批流程(python)
- Android初级开发笔记-- activity启动模式的学习(1)
- python常用模块(二)
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
- 前端学习(1750):前端调试值之call stack
- 【小工匠聊Modbus】04-调试工具
- php 远程文件是否存在,如何通过php判断本地及远程文件是否存在
- AWS redshift-hdb pg(Greenplum), 内置函数、数据类型、字符集
- (自学笔记) 谭浩强 C语言程序设计 第五版 第二章:算法
- Datalogic得利捷推出具有强大视觉系统功能的紧凑型智能相机P2X系列
- matlab在输电线路故障测距中应用,Matlab在输电线路故障测距中的应用
- 802.11系列标准简介
- 英国资深律师称加密货币和智能合约必然将成为社会主流
- debian 7 网络安装后无法联接wifi
- Access时间日期比较查询的方法总结
- 开放式耳机怎么选,最适合佩戴的几款耳机推荐
- 二元函数可微与偏导数_二元函数的连续、偏导数、可微之间的关系-推荐下载...
- 太原理工大学计算机科学与技术老师 王颖,王华 - 太原理工大学 - 信息与计算机学院...