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

访问 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字段。







免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM