Django--models一对多实例
需求
models一对多表的构建,创建数据,查询数据,数据前端展示等。
速查
1、创建数据
1
2
all_data
=
obj.clean()
#{'username': u'user1', 'user_group': 1}
models.User.objects.create(
*
*
all_data)
2、数据展示
1
2
user_list
=
models.Table.objects.
all
()
#获取表全部数据并传到前端
return
render(request,
'html'
,{
'user_list'
:user_list})
1
2
<
td
>{{ item.普通字段}}</
td
>
<
td
>{{ item.外建表对象.外建表字段}}</
td
>
3、外键数据查询
1
2
list
=
models.Table.objects.
filter
(外键表对象__外键表字段
=
外键字段值)
return
render(request,
'html'
,{
'list'
:
list
})
知识点
ForeignKey对应的是一个对象,是一行数据
添加对象的时候form表单里字段是xx_id
在html里获取外键表的字段数据是用点(.),后台中取数据也是(.)。
在后台中过滤条件(filter)中用双下划线(__),多连接表可用多个双下划线(__)。
详细
1 搭建基本环境
app01/models.py
1
2
3
4
5
6
7
8
9
10
11
class
UserGroup(models.Model):
caption
=
models.CharField(max_length
=
64
)
def
__unicode__(
self
):
return
self
.name
class
Host(models.Model):
hostname
=
models.CharField(max_length
=
64
)
ip
=
models.GenericIPAddressField()
user_group
=
models.ForeignKey(UserGroup)
def
__unicode__(
self
):
return
self
.name
app01/urls.py
1
2
3
4
5
from
app01.views
import
forign
urlpatterns
=
[
url(r
'^create_user_group/$'
,forign.create_user_group ),
url(r
'^create_user/$'
,forign.create_user ),
]
app01/views/forign.py
1
2
3
4
5
6
from
app01
import
models
def
create_user_group(request):
models.UserGroup.objects.create(caption
=
'CEO'
)
models.UserGroup.objects.create(caption
=
'CTO'
)
models.UserGroup.objects.create(caption
=
'COO'
)
return
HttpResponse(
'ok'
)
1
2
3
4
from
app01.forms
import
forign as ForignForm
def
create_user(request):
obj
=
ForignForm.CreateUserForm(request.POST)
return
render(request,
'forign/create_user.html'
,{
'obj'
:obj})
templates/forign/create_user.html
1
2
3
4
5
<
form
action
=
"/create_user/"
method
=
"post"
>
<
p
>{{ obj.username }}</
p
>
<
p
>{{ obj.user_group }}</
p
>
<
input
type
=
"submit"
value
=
"submit"
/>
</
form
>
app01/forms/forign.py
1
2
3
4
5
6
7
8
9
from
app01
import
models
class
CreateUserForm(forms.Form):
username
=
forms.CharField()
user_group
=
forms.IntegerField(
widget
=
forms.Select()
)
def
__init__(
self
,
*
args,
*
*
kwargs):
super
(CreateUserForm,
self
).__init__(
*
args,
*
*
kwargs)
self
.fields[
'user_group'
].widget.choices
=
models.UserGroup.objects.
all
().values_list(
'id'
,
'caption'
)
browser
1
2
|
all_data = obj.clean() #{'username': u'user1', 'user_group': 1} models.User.objects.create( * * all_data) |
1
2
|
user_list = models.Table.objects. all () #获取表全部数据并传到前端 return render(request, 'html' ,{ 'user_list' :user_list}) |
1
2
|
< td >{{ item.普通字段}}</ td > < td >{{ item.外建表对象.外建表字段}}</ td > |
1
2
|
list = models.Table.objects. filter (外键表对象__外键表字段 = 外键字段值) return render(request, 'html' ,{ 'list' : list }) |
ForeignKey对应的是一个对象,是一行数据
添加对象的时候form表单里字段是xx_id
在html里获取外键表的字段数据是用点(.),后台中取数据也是(.)。
在后台中过滤条件(filter)中用双下划线(__),多连接表可用多个双下划线(__)。
详细
1 搭建基本环境
app01/models.py
1
2
3
4
5
6
7
8
9
10
11
class
UserGroup(models.Model):
caption
=
models.CharField(max_length
=
64
)
def
__unicode__(
self
):
return
self
.name
class
Host(models.Model):
hostname
=
models.CharField(max_length
=
64
)
ip
=
models.GenericIPAddressField()
user_group
=
models.ForeignKey(UserGroup)
def
__unicode__(
self
):
return
self
.name
app01/urls.py
1
2
3
4
5
from
app01.views
import
forign
urlpatterns
=
[
url(r
'^create_user_group/$'
,forign.create_user_group ),
url(r
'^create_user/$'
,forign.create_user ),
]
app01/views/forign.py
1
2
3
4
5
6
from
app01
import
models
def
create_user_group(request):
models.UserGroup.objects.create(caption
=
'CEO'
)
models.UserGroup.objects.create(caption
=
'CTO'
)
models.UserGroup.objects.create(caption
=
'COO'
)
return
HttpResponse(
'ok'
)
1
2
3
4
from
app01.forms
import
forign as ForignForm
def
create_user(request):
obj
=
ForignForm.CreateUserForm(request.POST)
return
render(request,
'forign/create_user.html'
,{
'obj'
:obj})
templates/forign/create_user.html
1
2
3
4
5
<
form
action
=
"/create_user/"
method
=
"post"
>
<
p
>{{ obj.username }}</
p
>
<
p
>{{ obj.user_group }}</
p
>
<
input
type
=
"submit"
value
=
"submit"
/>
</
form
>
app01/forms/forign.py
1
2
3
4
5
6
7
8
9
from
app01
import
models
class
CreateUserForm(forms.Form):
username
=
forms.CharField()
user_group
=
forms.IntegerField(
widget
=
forms.Select()
)
def
__init__(
self
,
*
args,
*
*
kwargs):
super
(CreateUserForm,
self
).__init__(
*
args,
*
*
kwargs)
self
.fields[
'user_group'
].widget.choices
=
models.UserGroup.objects.
all
().values_list(
'id'
,
'caption'
)
browser
1
2
3
4
5
6
7
8
9
10
11
|
class UserGroup(models.Model): caption = models.CharField(max_length = 64 ) def __unicode__( self ): return self .name class Host(models.Model): hostname = models.CharField(max_length = 64 ) ip = models.GenericIPAddressField() user_group = models.ForeignKey(UserGroup) def __unicode__( self ): return self .name |
1
2
3
4
5
|
from app01.views import forign urlpatterns = [ url(r '^create_user_group/$' ,forign.create_user_group ), url(r '^create_user/$' ,forign.create_user ), ] |
1
2
3
4
5
6
|
from app01 import models def create_user_group(request): models.UserGroup.objects.create(caption = 'CEO' ) models.UserGroup.objects.create(caption = 'CTO' ) models.UserGroup.objects.create(caption = 'COO' ) return HttpResponse( 'ok' ) |
1
2
3
4
|
from app01.forms import forign as ForignForm def create_user(request): obj = ForignForm.CreateUserForm(request.POST) return render(request, 'forign/create_user.html' ,{ 'obj' :obj}) |
1
2
3
4
5
|
< form action = "/create_user/" method = "post" > < p >{{ obj.username }}</ p > < p >{{ obj.user_group }}</ p > < input type = "submit" value = "submit" /> </ form > |
1
2
3
4
5
6
7
8
9
|
from app01 import models class CreateUserForm(forms.Form): username = forms.CharField() user_group = forms.IntegerField( widget = forms.Select() ) def __init__( self , * args, * * kwargs): super (CreateUserForm, self ).__init__( * args, * * kwargs) self .fields[ 'user_group' ].widget.choices = models.UserGroup.objects. all ().values_list( 'id' , 'caption' ) |
访问 http://127.0.0.1:8000/create_user_group/,创建user_group表完成。
访问http://127.0.0.1:8000/create_user/,添加用户。
2 表单提交的数据写到数据库
app01/views/forign.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
from app01.forms import forign as ForignForm def create_user(request): obj = ForignForm.CreateUserForm(request.POST) if request.method = = "POST" : if obj.is_valid(): all_data = obj.clean() #{'username': u'user1', 'user_group': 1} group_obj = models.UserGroup.objects.get( id = all_data[ 'user_group' ]) ''' 第一种方法,对象级别的操作 group_obj是user_group表的一个对象, models.py中user_group列不是一个真正的字段,而是user_group表的一行(对象) 所以我们写user_group=的时候,就要把group_obj这个对象传进去 ''' models.User.objects.create( username = all_data[ 'username' ], user_group = group_obj ) ''' 另一种方法,数据库级别的操作,完全按照数据库中的字段赋值 Django自动把user_group变成了user_group_id,存储的是id,所以直接传id就行了。 ''' # models.User.objects.create( # username = all_data['username'], # user_group_id = all_data['user_group'] # ) return render(request, 'forign/create_user.html' ,{ 'obj' :obj}) |
如果表单提交的数据直接是user_group_id,就可以直接以**dic的方式create了。
app01/forms/forign.py
1
2
3
4
5
6
7
8
9
|
from app01 import models class CreateUserForm(forms.Form): username = forms.CharField() user_group_id = forms.IntegerField( #user_group==>user_group_id,下面的构造函数也一样变成user_group_id。 widget = forms.Select() ) def __init__( self , * args, * * kwargs): super (CreateUserForm, self ).__init__( * args, * * kwargs) self .fields[ 'user_group_id' ].widget.choices = models.UserGroup.objects. all ().values_list( 'id' , 'caption' ) |
app01/views/forign.py就简化成了
1
2
3
4
5
6
7
8
|
from app01.forms import forign as ForignForm def create_user(request): obj = ForignForm.CreateUserForm(request.POST) if request.method = = "POST" : if obj.is_valid(): all_data = obj.clean() #{'username': u'user1', 'user_group': 1} models.User.objects.create( * * all_data) return render(request, 'forign/create_user.html' ,{ 'obj' :obj}) |
templates/forign/create_user.html 前端也要改成user_group_id
1
|
< p >{{ obj.user_group_id }}</ p > |
访问页面添加数据,看数据库变化
3 用户数据展示
app01/views/forign.py
1
2
3
4
5
6
7
8
9
|
from app01.forms import forign as ForignForm def create_user(request): obj = ForignForm.CreateUserForm(request.POST) if request.method = = "POST" : if obj.is_valid(): all_data = obj.clean() models.User.objects.create( * * all_data) user_list = models.User.objects. all () #获取user表全部数据并传到前端 return render(request, 'forign/create_user.html' ,{ 'obj' :obj, 'user_list' :user_list}) |
templates/forign/create_user.html
1
2
3
4
5
6
7
8
|
< table > {% for item in user_list %} < tr > < td >{{ item.username }}</ td > < td >{{ item.user_group.caption }}</ td > </ tr > {% endfor %} </ table > |
user_group是一个对象,usergroup表的一行数据,所以能取到caption。
browser
4 GET请求
4.1 根据普通字段GET
browser
app01/views/forign.py user_list只包含用户输入的内容
1
2
3
4
5
6
7
8
9
|
def create_user(request): obj = ForignForm.CreateUserForm(request.POST) if request.method = = "POST" : if obj.is_valid(): all_data = obj.clean() models.User.objects.create( * * all_data) val = request.GET.get( 'username' ) user_list = models.User.objects. filter (username = val) return render(request, 'forign/create_user.html' ,{ 'obj' :obj, 'user_list' :user_list}) |
4.2 根据外键字段GET
browser
app01/views/forign.py
1
2
3
4
5
6
7
8
9
|
def create_user(request): obj = ForignForm.CreateUserForm(request.POST) if request.method = = "POST" : if obj.is_valid(): all_data = obj.clean() models.User.objects.create( * * all_data) val = request.GET.get( 'usergroup' ) #url中的usergroup是参数,什么都成 user_list = models.User.objects. filter (user_group__caption = val) return render(request, 'forign/create_user.html' ,{ 'obj' :obj, 'user_list' :user_list}) |
user_group__caption,对象user_group外联表获取caption字段。
Django--models一对多实例的更多相关文章
- python Django html 一对多数据实例 模态对话框添加数据
- django models 数据库操作
django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- Django:用户登录实例
Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...
- 使用eclipse搭建第一个python+Django的web开发实例
python+Django的web开发实例 一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的 ...
- Django models模型
Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成p ...
- Django models 操作高级补充
Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra
- Django models Form model_form 关系及区别
Django models Form model_form
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
随机推荐
- jQuery 通配符
通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']");//id属 ...
- Mac 安装终端软件
1.安装或者重新安装lua环境 下载 lua 地址: http://www.lua.org/versions.html 1.进入 lua 目录 2.make macosx 3.sudo make in ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- algo_预备
章 C + +程序设计 大家好!现在我们将要开始一个穿越" 数据结构.算法和程序" 这个抽象世界的特殊旅程,以解决现实生活中的许多难题.在程序开发过程中通常需要做到如下两点:一是高 ...
- MMS关键指标意义&各数值区间意义
MMS关键指标意义&各数值区间意义 What's MMS MongoDB Management Service (MMS) is a suite of services for managin ...
- iOS开发问题之Could not instantiate class named NSLayoutConstraint
这个问题在ios6.0之前的版本中运行会出现,因为使用Xcode 4.5之后的版本新建项目默认是选中AutoLayout的,但这个特性是在iOS6.0之后的版本中才支持的. 解决办法是选中.stroy ...
- Git简记
1. 如何在GitHub上下载资源? 有2种方法: (1)直接在WebBrowser中下载. 比如要下载 https://github.com/numbbbbb/progit-zh-pdf-epub- ...
- [转载]在 JavaScript 中判断“空值”
http://lync.in/check-empty-value-in-javascript/ 有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为 ...
- saiku、mondrian前奏之——立方体、维度、Schema的基本概念
以前介绍了几个基本工具:saiku 和 Schema Workbench,算是入门级别的了解多维报表,如果要继续深入,需要深入了解如下几个概念: 1.OLAP 联机分析处理,和他对应的是OLTP(联机 ...
- preg_match_all正则表达式的基本使用
了解正则表达式之前,须要掌握一些常用的正则表达式的基础知识,这些如果能记得最好记得,记不住须要用的时候能查到就行,就多个特殊字符,所以说正则表达式玩的就是特殊,具体大家可以查看更加细致的说明. pre ...