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.nameclass 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 forignurlpatterns = [ 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 modelsdef 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 ForignFormdef 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 modelsclass 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 ForignFormdef 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 modelsclass 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 ForignFormdef 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 ForignFormdef 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 几种数据查询结果的对比
随机推荐
- Revit中如何控制图元的显示与隐藏
Revit建模过程中经常会遇到图元的相互遮挡的情况,为了将一些图元显示出来,就需要将一些不需要显示的图元隐藏掉,这就需要用到"隐藏/重置"工具,在Revit绘图窗口左下角提供了一排 ...
- Windows 系统下设置Nodejs NPM全局路径
Windows下的Nodejs npm路径是appdata,很不爽,想改回来,但是在cmd下执行以下命令也无效 npm config set cache "D:\nodejs\node_ca ...
- C++ 虚函数在基类与派生类对象间的表现及其分析
近来看了侯捷的<深入浅出MFC>,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑.因为书中说了这么一句:使用“基类之指针”指向“派生类之对象”,由该指针只能调用基类所定义的函 ...
- Ubuntu 汉化及kate汉化和使用自带终端的解决方式
汉化方法:1,打开屏幕上方的“system”(系统),里面有个“Administration”(系统管理),选择“Snaptic Package Manager”(软件包管理器),打开,输入密码后进入 ...
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
转自 http://blog.csdn.net/zzfsuiye/article/details/8251060 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInte ...
- android:themes.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2006 The Andr ...
- Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间 把LOB字段的SEGMENT 存放在指定表空间.清理CLOB字段及压缩CLOB空间 1.创建LOB字段存放表空间:create ...
- 1.C#中通过委托Action消除重复代码
阅读目录 一:重复的代码 二:使用委托消除重复代码 一:重复的代码 我们在写一些方法的时候,会在里面可能出现异常的地方使用try catch语句,这样每个方法都会有try catch语 ...
- This application is currently offline. To enable the application, remove the app_offline.htm file from the application r
退出VS ,把程序中主目录里的app_offline.htm文件删除,重新启动VS 就可以了.