需求
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
訪問 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字段。