class UserType(models.Model):
caption = models.CharField(max_length=32) class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
userType = models.ForeignKey('UserType', to_field='id', on_delete=models.CASCADE)
a = models.User.objects.filter(id=1)
结果返回的是一个Querset,内部元素都是对象
递归打印结果:
for i in a:
print(i.name, i.age, i.userType.caption)
因为结果QuerySet里面是一个列表,所以可以通过[0]的方式将对象取出
print(a[0].name, a[0].age, a[0].userType.caption)
a = models.User.objects.filter(id=1).values('name', 'age', 'userType__caption')
结果返回的是一个Querset,内部元素都是字典
打印结果
print(a[0]['name'], a[0]['userType__caption'])
a = models.User.objects.filter(id=1).values_list('name', 'age', 'userType__caption')
结果返回的是一个Querset,内部元素都是元组 models.User.objects.get(id=1)
获取到的是一个对象,如果不存在,会抛出异常
models.User.objects.filter(id=1).first()
返回的是一个对象或者none,如果不存在,不会抛出异常。在获取单个值时,此方法更加。

获取外键数据
a = models.User.objects.filter(id=1)
for i in a:
print(i.name, i.age, i.userType.caption)
userType为外键,i.userType在获取时是一个对象,所以在获取其他表的数据时,直接加“.”+另一个表字段名(此例i.userType.caption),即可获取数据。
id作为数据库表的唯一值,可以在前端作为一个查询条件,例如
<table>
<tr host-id="{{ row.id}}">
<td>######</td>
</tr>
</table> forigenkey在使用是可以被嵌套使用,比如一个表中包含一个外键,外键关联的表中又包含一个外键,因为只要能获取对象,就可以通过"."+字段名称获取相应表中的数据。
多对多
  创建多对多
    方式一:自定义关系表
    
class UserType(models.Model):
caption = models.CharField(max_length=32) class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
userType = models.ForeignKey('UserType', to_field='id', on_delete=models.CASCADE) class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to='User', to_field='id', on_delete=models.CASCADE) class Application(models.Model):
name = models.CharField(max_length=32) class HostToApp(models.Model):
hobj = models.ForeignKey(to='Host', to_field='nid', on_delete=models.CASCADE)
aobj = models.ForeignKey(to='Application', to_field='id', on_delete=models.CASCADE)
    方式二:
class UserType(models.Model):
caption = models.CharField(max_length=32) class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
userType = models.ForeignKey('UserType', to_field='id', on_delete=models.CASCADE) class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to='User', to_field='id', on_delete=models.CASCADE) class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField('Host')

 二者都能创建多对多关系,区别在于采用ForigenKey的方式需要自己创建关系表,并且字段数量可以自定制,因为可以得到第三张表的对象,所以可以直接对第三张表做操作;采用
ManyToManyField的方式无需字定义关系表(关系表自动生成),缺点是字段不算id列,只能有两个(即两张表的id),而且无法直接对第三张生成的表进行操作(因为models文件中并没有那个对象)。
操作ManyToManyField生成的第三张表:
obj =
Application.objects.get(id=1) obj.r.add(1)
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4]) obj.r.remove(1)
obj.r.remove(2,3)
obj.r.remove(*[2,3,4]) obj.r.clear()
# set代表更新指定id的数据,本例为id=1
obj.r.set([3,5,7]) 获取一个应用对应的所有主机:
obj = Application.objects.get(id=1)
obj.r.all()
获取一个主机对应的所有应用:
obj = Host.objects.get(id=1)
obj.application_set.all()

采用ManyToManyField方式也可以进行字段扩展,不过需要添加through参数,该参数指定了中间模型,例如:
class Author(models.Model):
  name = models.CharFiled(max_length=32)
  email = models.EmailField() class Book(models.Model):
  title = models.CharField(max_length=32)
  authors = models.ManyToManyField(Author, through='BookAuthor') class BookAuthor(models.Model):
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  book = models.ForeignKey(Book, on_delete=models.CASCADE)   pushd_at = models.DateTimeField(default=timezone_now) 当我们使用多对多的中间模型之后,add(),remove(),create()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例,例:
#  添加作者  ringo
ringo = Author.objects.create(name='Ringo',email='ringo@qq.com')
# 添加作者paul
paul = Author.objects.create(name='Paul',email='paul@qq.com')
# 添加书籍 python book1
book1 = Book.objects.create(title='python book1')
# 给多对多添加值也就是添加多对多关系
m1 = BookAuthor(author=ringo,book=book)
# 第二种添加方式
m2 = BookAuthor.objects,create(author=paul,book=book1)

https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display

Model.get_FOO_display()

For every field that has choices set, the object will have a get_FOO_display() method, where FOO is the name of the field. This method returns the “human-readable” value of the field.

For example:

from django.db import models

class Person(models.Model):
SHIRT_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=2, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
												

models说明的更多相关文章

  1. Django models对象的select_related方法(减少查询次数)

    表结构 先创建一个新的app python manage.py startapp test01 在settings.py注册一下app INSTALLED_APPS = ( 'django.contr ...

  2. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  3. Django models Form model_form 关系及区别

    Django models Form model_form

  4. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  5. django models进行数据库增删查改

    在cmd 上运行 python manage.py shell   引入models的定义 from app.models import  myclass   ##先打这一行    ------这些是 ...

  6. Django基础,Day2 - 编写urls,views,models

    编写views views:作为MVC中的C,接收用户的输入,调用数据库Model层和业务逻辑Model层,处理后将处理结果渲染到V层中去. polls/views.py: from django.h ...

  7. 【Django】--Models 和ORM以及admin配置

    Models 数据库的配置 1    django默认支持sqlite,mysql, oracle,postgresql数据库 <1>sqlite django默认使用sqlite的数据库 ...

  8. 广义线性模型(Generalized Linear Models)

    前面的文章已经介绍了一个回归和一个分类的例子.在逻辑回归模型中我们假设: 在分类问题中我们假设: 他们都是广义线性模型中的一个例子,在理解广义线性模型之前需要先理解指数分布族. 指数分布族(The E ...

  9. Django 1.7 throws django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

    在程序中要添加django.setup() 整个程序如下所示 import os import django def populate(): python_cat = add_cat('Python' ...

  10. Django models知识小点

    django 为使用一种新的方式,即关系对象映射(ORM) 一,创建表 1,基本结构 注意: 1,创建标的时候,如果我们不给表加自增列,生成表的时候会默认给我们生成一列为ID的自增列,当然我们也可以自 ...

随机推荐

  1. debug时打到了URLClassLoader.class里面,

    一.解决方法,查看breakpoints,看有没有在这个类里面打断点,有时会系统自动打断电在这个类里面, 二.在设置里面,找到debug,去掉debug的前面几个断电设置.

  2. C Primer Plus学习笔记(四)- 运算符、表达式和语句

    基本运算符 赋值运算符:= 在C语言中,=不是“相等”,而是赋值运算符,把左边的值赋给右边的变量 a = 2018; //把值2018赋给变量a 赋值表达式语句的目的是把值储存到内存位置上,用于储存值 ...

  3. 部署和调优 2.1 squid正向代理

    安装squid yum install -y squid Squid 官方网站为 http://www.squid-cache.org 打开注释掉的 cache_dir ufs / 缓存目录的位置,大 ...

  4. js中FOR循环的陷阱

    //闭包解决 循环输出的问题 for(var i=0;i<rows.length;i++) {( function (i) { })(i);

  5. curl的特殊使用

    1.php可以通过shell_exec()和其他系统函数使用curl,也可用PHP带的libcurl库. $curl = curl_init("wwww.baidu.com"); ...

  6. cocos2d中setBlendFunc设置颜色混合方案

    CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案.ccBlendFunc包含了一个src和一个dst,分别表示源和目标的运算因子. 如 ...

  7. 你可能不知道的pdf的功能

    可以创建交互式的pdf,比如在pdf页面添加一个按钮, 添加一个文本框. 上篇文章说了pdf有可移植性,这是个非常重要的特性,我就想能否把3d模型放入到pdf中,这样即使对方电脑没有3d软件也可以查看 ...

  8. 算法Sedgewick第四版-第1章基础-004一封装交易对象

    1. package ADT; /****************************************************************************** * Co ...

  9. clions的使用

    最近无聊玩了下CLion这个IDE,顺便学习了下CMAKE怎么使用.话说CLion的CMAKE的支持还不是特别的完好,和命令行模式还有有区别,有如下几个问题: 1:CMAKE的编译目录不能指定,而是I ...

  10. UNIX和Linux信号

    1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号).不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失 ...