需求

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

Django--models一对多实例的更多相关文章

  1. python Django html 一对多数据实例 模态对话框添加数据

  2. django models 数据库操作

    django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...

  3. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  4. Django:用户登录实例

    Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...

  5. 使用eclipse搭建第一个python+Django的web开发实例

    python+Django的web开发实例   一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的 ...

  6. Django models模型

    Django models模型 一. 所谓Django models模型,是指的对数据库的抽象模型,models在英文中的意思是模型,模板的意思,在这里的意思是通过models,将数据库的借口抽象成p ...

  7. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  8. Django models Form model_form 关系及区别

    Django models Form model_form

  9. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

随机推荐

  1. [leetcode]Find Minimum in Rotated Sorted Array II @ Python

    原题地址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 解题思路:这道题和上一道题的区别是,数组中 ...

  2. Scala 深入浅出实战经典 第58讲:Scala中Abstract Types实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  3. HDU 4759 Poker Shuffle

    Poker Shuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. 关于SpeedButton中使用下划线快捷键不响应的问题

    在Windows应用程序,很多都有快捷键功能,这个Delphi也有,就是一个按钮上面有一个比如剪切(&X),这个时候剪切的快捷键就是Alt+X,这个功能有时候还是挺好用的,最近,公司中有同事, ...

  5. C#导出EXCEL的几种方法

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.W ...

  6. spring 集成 Hibernate4.3.X org.hibernate.service.jta.platform.spi.JtaPlatform异常

    使用Spring3.2.4集成Hibernate4.3.5时,出现以下异常 Causedby:java.lang.ClassNotFoundException:org.hibernate.servic ...

  7. WebApi中直接返回json字符串的方法

    [HttpPost] public HttpResponseMessage Upload() { string json = "{\"result\":\"tr ...

  8. ikvm.net简介

    ikvm.net是什么 http://www.ikvm.net/ ikvm.net是能够运行在mono和.net framework的java虚拟机.它包括了 在.net中实现的一个java虚拟机 j ...

  9. cocos2dx 2.x 骨骼动画优化

    本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html 公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一 ...

  10. 无法打开包括文件:'atlrx.h'的解决办法

    VS 2008中由于将ALT项目的部分代码剥离出去成为了独立的开源项目,需要用到ALT中正则表达式等功能就需要手动下载. 我不是第一个遇到这个问题的,所以已经有前人给出了解决方案. 可到http:// ...