前面已经学习了在Django里面,如何对单表进行增删改查询。下面学习一下如果存在外键约束的情况下,如何创建。
例1
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from
django.db
import
models
class
UserGroup(models.Model):
uid
=
models.AutoField(primary_key
=
True
)
caption
=
models.CharField(max_length
=
32
,unique
=
True
)
ctime
=
models.DateTimeField(auto_now_add
=
True
, null
=
True
)
uptime
=
models.DateTimeField(auto_now
=
True
, null
=
True
)
class
UserInfo(models.Model):
username
=
models.CharField(max_length
=
32
,blank
=
True
,verbose_name
=
'用户名'
)
password
=
models.CharField(max_length
=
60
, help_text
=
'pwd'
)
email
=
models.CharField(max_length
=
60
)
test
=
models.EmailField(max_length
=
19
,null
=
True
,error_messages
=
{
'invalid'
:
'请输入密码'
})
# user_group_id 数字
user_group
=
models.ForeignKey(
"UserGroup"
,to_field
=
'uid'
)
# (uid,catption,ctime,uptimew)
user_type_choices
=
(
(
1
,
'超级用户'
),
(
2
,
'普通用户'
),
(
3
,
'普普通用户'
),
)
user_type_id
=
models.IntegerField(choices
=
user_type_choices,default
=
1
)
|
创建外键约束的关键语句就是一条命令。
1
|
user_group
=
models.ForeignKey(
"UserGroup"
,to_field
=
'uid'
)
# (uid,catption,ctime,uptime)
|
注意几点:
to_field 指向另外一个类的主键
默认情况下,他会创建级联删除的约束,也就是说如果我删除user_group里面的一行数据,userInfo表里和这个uid数据关联的行都会自动删除;我们可以通过 on_delete=models.SET_NULL来禁止删除
在UserInfo的表里,他会自动创建一个新的字段 user_group_id 作为外键的字段,而不是我们类里面定义的user_group。但是有趣的是,我们在程序里面可以直接在userInfo的对象里面引用 user_group对象。
数据库里面创建的表,注意字段名称
下面看个调用的实例
例2. 可以看见我能够通过row.user_group.caption来直接获取用户组表的信息,相当于执行了一个left join的查询操作
views.py
1
2
3
4
5
|
def
user_info(request):
if
request.method
=
=
"GET"
:
user_list
=
models.UserInfo.objects.
all
()
group_list
=
models.UserGroup.objects.
all
()
return
render(request,
'user_info.html'
, {
'user_list'
: user_list,
"group_list"
: group_list})
|
user_info.html
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
|
<
h3
>添加用户</
h3
>
<
form
method
=
"POST"
action
=
"/cmdb/user_info/"
>
<
input
type
=
"text"
name
=
"user"
/>
<
input
type
=
"text"
name
=
"pwd"
/>
<
select
name
=
"group_id"
>
{% for item in group_list %}
<
option
value
=
"{{ item.uid }}"
>{{ item.caption }}</
option
>
{% endfor %}
</
select
>
<
input
type
=
"submit"
value
=
"添加"
/>
</
form
>
<
h3
>用户列表</
h3
>
<
ul
>
{% for row in user_list %}
<
li
>
<
a
href
=
"/cmdb/userdetail-{{ row.id }}/"
>{{ row.username }}</
a
> |
<
span
> {{ row.user_group.caption }} </
span
>
<
a
href
=
"/cmdb/userdel-{{ row.id }}/"
>删除</
a
> |
<
a
href
=
"/cmdb/useredit-{{ row.id }}/"
>编辑</
a
>
</
li
>
{% endfor %}
</
ul
>
|
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1946602,如需转载请自行联系原作者