转自:http://www.cnblogs.com/blogofwyl/p/4283513.html
 
作为一个新人(刚刚大学还没有毕业就出来实习,可以说是真的什么都不知到,什么都要重新学,但是这样真的可以锻炼自己的意志力和能力)。现在在公
司是前端和后端一起坐,所以要学的东西是真的多的让人想不到。在学习的过程中也越到了不少的问题,今天和大家分享一下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 是不兼容的。

3.max_num_in_admin

于内联编辑对象,这个是要在管理界面里显示的相关对象的最多个数。所以,如果披萨最多 只会
有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的使用相关推荐

  1. Django models模型

    Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成p ...

  2. django models 之字段详解

         数据库模型是django操作数据库的主要途径,也是django和数据库连接的主要方法,几乎所有对数据库的操作都是通过models来完成的,下面我们就简单介绍一下创建模型时会涉及到的字段类型, ...

  3. Django models Form model_form 关系及区别

    Django models Form model_form 转载于:https://www.cnblogs.com/hellojesson/p/6234636.html

  4. Django models的诡异异常RelatedObjectDoesNotExist

    Django models的诡异异常RelatedObjectDoesNotExist 参考文章: (1)Django models的诡异异常RelatedObjectDoesNotExist (2) ...

  5. How to manage concurrency in Django models

    How to manage concurrency in Django models The days of desktop systems serving single users are long ...

  6. django models 配置

    一, 使用已有视图 场景: 项目中用到了一个视图:DT_users 对应的django models.py配置为: class DT_users(models.Model):...class Meta ...

  7. Django models 筛选不等于

    Django models 筛选不等于 目前的查询 j = Job.objects.filter(status="0").all() 筛选不等于 0 并不能用如下写法 j = Jo ...

  8. Django Abstract Models使用下划线设置related_name

    前言 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895,817, 687 有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 我有一个 ...

  9. 00x: Django models.Model详解

    Models model是对于信息的一种模型封装与定义.它包含了你要存储的必要字段和操作数据的方法.一句话概括就是,每个模型映射了一张数据表. 基本概念: 每个model都是继承于django.db. ...

最新文章

  1. Android开发工具
  2. Linux7 下重新安装YUM
  3. python小项目实例流程-公司内项目对接钉钉审批流程(python)
  4. Android初级开发笔记-- activity启动模式的学习(1)
  5. python常用模块(二)
  6. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
  7. 前端学习(1750):前端调试值之call stack
  8. 【小工匠聊Modbus】04-调试工具
  9. php 远程文件是否存在,如何通过php判断本地及远程文件是否存在
  10. AWS redshift-hdb pg(Greenplum), 内置函数、数据类型、字符集
  11. (自学笔记) 谭浩强 C语言程序设计 第五版 第二章:算法
  12. Datalogic得利捷推出具有强大视觉系统功能的紧凑型智能相机P2X系列
  13. matlab在输电线路故障测距中应用,Matlab在输电线路故障测距中的应用
  14. 802.11系列标准简介
  15. 英国资深律师称加密货币和智能合约必然将成为社会主流
  16. debian 7 网络安装后无法联接wifi
  17. Access时间日期比较查询的方法总结
  18. 开放式耳机怎么选,最适合佩戴的几款耳机推荐
  19. 二元函数可微与偏导数_二元函数的连续、偏导数、可微之间的关系-推荐下载...
  20. 太原理工大学计算机科学与技术老师 王颖,王华 - 太原理工大学 - 信息与计算机学院...

热门文章

  1. Mockito 的使用
  2. jdbc-------JDBCUtil类 工具类
  3. 在spring中该如何使用DTO,以及DTO和Entity的关系
  4. daterangepicker双日历插件的使用
  5. nessus重置密码
  6. Android 4.4及以上系统下应用的状态栏颜色渐变效果的实现
  7. Beaglebone Back学习五(PWM测试)
  8. 如何取得好的软件设计
  9. 校验输入框的内容不能重复_答应我,用了这个jupyter插件,别再重复造轮子了
  10. java实体类转map_十五道经典面试题-JAVA基础篇