首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Django使用表单操作数据库

2023-11-12 来源:华拓网
[ # 以上还有很多url路由,这里仅列出需要的路由 ## 利用表单增加图书,实现前台与数据库交互 url(r‘^addbook/$‘, polls_views.addbook),]

以上url匹配地址http://127.0.0.1/addbook/,当用户访问该地址时,返回一个页面给用户。

  • 返回给用户页面bookadd.html
  • 在views.py文件中添加方法,返回页面bookadd.html。

    ## 返回给用户页面bookadd.htmldef addbook(request): return render(request, ‘bookadd.html‘)

    在templates目录下新建bookadd.html文件,添加HTML代码。

    HTML代码:

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>增加图书</title> <script src="../js/jquery-2.1.3.min.js"></script> <style> * { margin: 0; padding: 0; </style></head><body> <h2>增加图书</h2> <h3>GET方式</h3> <form action="/addbooktodatabase/" method="get" name="addbook"> <p><span>书名:</span><input type="text" placeholder="书名" name="book_name"></p> <p><span>作者:</span><input type="text" placeholder="作者" name="author"></p> <p><span>作者年龄:</span><input type="text" placeholder="作者年龄" name="author_age"></p> <input type="reset">    <input type="submit" value="增加"> </form> <h3>POST方式</h3> <form action="/addbooktodatabase/" method="post" name="addbook"> {% csrf_token %} <p><span>书名:</span><input type="text" placeholder="书名" name="book_name"></p> <p><span>作者:</span><input type="text" placeholder="作者" name="author"></p> <p><span>作者年龄:</span><input type="text" placeholder="作者年龄" name="author_age"></p> <input type="reset">    <input type="submit" value="增加"> </form></body></html>

    显示效果如下:技术分享图片

  • 在用户本地页面判断操作是否合法
  • 使用JavaScript或JQuery实现判断,这个实现方法很多,不再赘述。

  • 用户提交成功,后台传递给指定url,更新数据库
  • 在urls.py文件中添加url路由

    urlpatterns = [ # 以上还有很多url路由,这里仅列出需要的路由 ## 处理表单提交的数据,实现前台与数据库交互 url(r‘^addbooktodatabase/‘, polls_views.addbooktodatabase),]

    在views.py中增加更新数据库方法

    # 向图书馆增加数据GET或POST方法方法def addbooktodatabase(request): # 获取参数book_name,author,author_age if request.method == "GET": book_name = request.GET["book_name"] author_name = request.GET["author"] author_age = request.GET["author_age"] else: book_name = request.POST["book_name"] author_name = request.POST["author"] author_age = request.POST["author_age"] ## 先增加作者信息 from polls.models import Person person = Person() person.name = author_name person.age = author_age person.save() ## 增加图书信息 from polls.models import Book bookadded = Book(name=book_name) # 保存修改 bookadded.person_id = person.id bookadded.save() # 重定向到添加成功页面 from django.http import HttpResponseRedirect return HttpResponseRedirect(‘/addok/‘)
  • 返回页面addok/html
  • 在urls.py文件中添加url路由

    urlpatterns = [ # 以上还有很多url路由,这里仅列出需要的路由 # 添加成功后返回添加成功页面addok url(r‘^addok/‘, polls_views.addok),]

    在templates目录下新建addok.html文件,添加HTML代码。

    HTML代码:

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>添加成功</title> <style> * { margin: 0; padding: 0; } a{ text-decoration:none; } </style></head><body> <div> <p>添加图书成功</p> <p><a href="/addbook/">继续添加</a></p> <p><a href="/booklist/">查看图书列表</a></p> </div></body></html>

    显示效果如下:

    技术分享图片

  • 当用户点击“查看图书列表”时,传递bookList.html页面
  • bookList.html在另一篇博文中已实现,请参考:利用Django中的url方法实现地址动态拼接自动生成超链接地址

    显示效果如下:技术分享图片

    可以看到,图书“水浒传已经添加成功”。

    四、总结
    1. 本文完整示例:完整示例;
    2. 能力有限,欢迎指错。

    小编还为您整理了以下内容,可能对您也有帮助:

    django怎么使用本机mysql数据库

    #修改后的models.py  from django.db import models  class Employee(models.Model): name = models.CharField(max_lenght=20)

    5.根据自定类的结构,同步mysql表以及表的结构(blog_employee表,name字段以及 主键id)

      python manage.py syncdb

    同步之后,查看mysql的表以及表结构:

    技术分享

    表名称:python的应用名称+自定义类的名称

    表结构:自定义类的字段

    此时,你的django框架的python应用,数据模型与mysql的表结构对应上;

    python的Django使用mysql基本操作

    标签:

    django怎么使用本机mysql数据库

    #修改后的models.py  from django.db import models  class Employee(models.Model): name = models.CharField(max_lenght=20)

    5.根据自定类的结构,同步mysql表以及表的结构(blog_employee表,name字段以及 主键id)

      python manage.py syncdb

    同步之后,查看mysql的表以及表结构:

    技术分享

    表名称:python的应用名称+自定义类的名称

    表结构:自定义类的字段

    此时,你的django框架的python应用,数据模型与mysql的表结构对应上;

    python的Django使用mysql基本操作

    标签:

    django数据库使用(django操作mysql数据库)

    在django程序外部使用djangomodels,我给你端示例代码你看看:

    fromdjango.core.managementimportsetup_environ

    importQB.settings

    setup_environ(QB.settings)

    fromrecharge.modelsimportOrder,QB是我的project名称,recharge是我的app名称

    django数据库使用(django操作mysql数据库)

    在django程序外部使用djangomodels,我给你端示例代码你看看:

    fromdjango.core.managementimportsetup_environ

    importQB.settings

    setup_environ(QB.settings)

    fromrecharge.modelsimportOrder,QB是我的project名称,recharge是我的app名称

    Django如何使用多数据库方法介绍

    有些项目可能涉及到使用多个数据库的情况,方法很简单。接下来通过本文给大家介绍Django使用多数据库的方法,需要的朋友参考下吧

    有些项目可能涉及到使用多个数据库的情况,方法很简单。

    1.在settings中设定DATABASE

    比如要使用两个数据库:

    这样就确定了2个数据库,别名一个为default,一个为user。数据库的别名可以任意确定。

    default的别名比较特殊,一个Model在路由中没有特别选择时,默认使用default数据库。

    当然,default也可以设置为空:

    这样,因为没有了默认的数据库,就需要为所有的Model,包括使用的第三方库中的Model做好数据库路由选择。

    2.为需要做出数据库选择的Model规定app_label

    3.写Database Routers

    Database Router用来确定一个Model使用哪一个数据库,主要定义以下四个方法:

    db_for_read(model, **hints)

    规定model使用哪一个数据库读取。

    db_for_write(model, **hints)

    规定model使用哪一个数据库写入。

    allow_relation(obj1, obj2, **hints)

    确定obj1和obj2之间是否可以产生关联, 主要用于foreign key和 many to many操作。

    allow_migrate(db, app_label, model_name=None, **hints)

    确定migrate操作是否可以在别名为db的数据库上运行。

    一个完整的例子:

    数据库设定:

    如果想要达到如下效果:

    app_label为auth的Model读写都在auth_db中完成,其余的Model写入在primary中完成,读取随机在replica1和replica2中完成。

    auth:

    这样app_label为auth的Model读写都在auth_db中完成,允许有关联,migrate只在auth_db数据库中可以运行。

    其余的:

    这样读取在随机在replica1和replica2中完成,写入使用primary。

    最后在settings中设定:

    就可以了。

    进行migrate操作时:

    migrate操作默认对default数据库进行操作,要对其它数据库进行操作,可以使用--database选项,后面为数据库的别名。

    与此相应的,dbshell,mpdata,loaddata命令都有--database选项。

    也可以手动的选择路由:

    查询:

    保存:

    移动:

    以上的代码会产生问题,当p在first数据库中第一次保存时,会默认生成一个主键,这样使用second数据库保存时,p已经有了主键,这个主键如果未被使用不会产生问题,但如果先前被使用了,就会覆盖原先的数据。

    有两个解决方法;

    1.保存前清除主键:

    2.使用force_insert

    删除:

    从哪个数据库取得的对象,从哪删除

    如果想把一个对象从legacy_users数据库转移到new_users数据库:

    django 编辑表单,数据怎么回显呀

    如果我没有理解错误,这个很基本啊。在python教程里就有。所以我想你应该是对django还不熟悉。看看它官网上的那个教程。英文的,仔细,耐心些边看边练,看完它。

    简单说django通过设置model将数据库的数据可以方便的通过class.objects.all这样的方法拿到,也可以使用get和filter等。拿到数据后,它存在model里的类的对象里。然后你将这个变量传递到template里去。在template里再将变量显示在html里。

    通过HttpResponse这样的对象再将html返回给浏览器。

    还有一种略简洁的方法,但是原理一样。里面有一个form对象,可以简化模板的使用,让传递变量更简单,不过做起model来,就更复杂一些。

    django 编辑表单,数据怎么回显呀

    如果我没有理解错误,这个很基本啊。在python教程里就有。所以我想你应该是对django还不熟悉。看看它官网上的那个教程。英文的,仔细,耐心些边看边练,看完它。

    简单说django通过设置model将数据库的数据可以方便的通过class.objects.all这样的方法拿到,也可以使用get和filter等。拿到数据后,它存在model里的类的对象里。然后你将这个变量传递到template里去。在template里再将变量显示在html里。

    通过HttpResponse这样的对象再将html返回给浏览器。

    还有一种略简洁的方法,但是原理一样。里面有一个form对象,可以简化模板的使用,让传递变量更简单,不过做起model来,就更复杂一些。

    django怎么用

    社区版和专业版区别在于,专业版可以直接进行Django项目的创建,而社区版则需要手动进行创建。鉴于我们都是刚入门,我们还是手动创建更好,更利于我们熟悉Django的命令和相关操作。

    新建 Django 的最小程序

    新建一个Web框架工程

    我们再命令行界面进到要创建项目的目录下,然后输入以下命令:

    django-admin startproject mysite

    这里的 django-admin 是一个用于管理 django 的工具,在我们安装 django 的过程中会默认进行依赖安装。 mysite 是工程名称,可以根据自己的需求进行修改。创建后,我们会得到以下的目录结构:

    最小的项目目录结构
    最小的项目目录结构

    修改工程,增加功能

    我们在这里需要增加具体应用,以及通过配置 路由映射 来进行相关功能的增加。

    工程(project)和应用(app)什么关系呢?

  • 工程对应于一个网站,是配置和应用的集合
  • 应用对应于特定功能,是具体功能的载体
  • 配置和功能分离是高度模块化的体现
    1. 【修改工程】创建一个具体应用(app)

    命令:python manage.py startapp helloapp

    命令执行完成后,会在根目录下新建一个helloapp的目录

    helloapp目录
    helloapp目录
    1. 【修改工程】修改应用的views.py

      # Create your views here.
      from django.http import HttpResponse

      def hello(request):
      return HttpResponse("Hello World! I am coming...")
    2. 【修改工程】修改URL路由

      在和项目命对应的目录下的 urls.py 文件中指定URL与处理函数之间的路径关系。

      from django.contrib import admin
      from django.urls import include, path
      from helloapp import views # from the subapp import related views

      urlpatterns = [ # config the routes like vue's vue-router
      path('admin/', admin.site.urls),
      path('index/', views.hello),
      ]

      我们首先需要引入对应app下的 views 文件,然后配置路由对应关系

    3. 【修改工程】修改URL路由

      path('index/', views.hello)

      这里的 第一个参数 表示url地址,我们这里的就会响应 域名/index/这个路径的访问; 第二个参数 则表示指定某个处理函数,例如这里我们制定了 views.hello

      访问页面
      访问页面

    运行工程

    python manage.py runserver

    运行后我们访问对应的路由,就会得到相应的返回信息;如果访问未配置的则会返回 404 notfound。

    不得不说的 django-adminmanage.py

    django-admin

    django-admin <command> [options]

    django-admin是一个Django框架全局的管理工具:

  • 建立并管理Django工程
  • 建立并管理Django工程使用的数据库
  • 控制调试或日志信息
  • 运行并维护Django工程
  • 我们也可以通过 django-admin help 命令来查看更多的功能

    manage.py

    python manage.py <command> [options]

    功能和 django-admin 类似,但是作用范围仅作用于当前项目。

    我们也可以通过 python manage.py help 命令来查看更多功能。

    最小程序的改进

    需求:返回一个HTML页面,而不是一个字符串
    思路:建立模板(T),对应特定请求,返回模板页面
    新建hello2app,通过index2来访问

    新建hello2app应用

    `python manage.py startapp hello2app`

    使用templateTest.html为返回页面,修改views.py

    ```python# hello2app/views.pyfrom django.shortcuts import renderdef hello(request): return render(request, "PYC01-HTMLJSDemo.html")```这里,`render()` 是一个打包函数,第一个参数是 request, 第二个参数是要返回的模板页面。
  • 在hello2app应用中,新增urls.py文件(本地路由文件)

    # hello2app/urls.py

    from django.urls import path
    from . import views # . 代表当前 app
    urlpatterns = [ # urlpatterns 变量名成是固定的
    path('', views.hello)
    ]
  • 在全局路由文件中增加对本应用路由文件的引用

    # mysite/urls.py

    from django.contrib import admin
    from django.urls import include, path
    # include()函数,用于引入其他路由文件
    from helloapp import views
    urlpatterns = [
    path('index2/', include('hello2app.urls')),
    # 将hello2app的局部路由增加到全局路由中
    path('index/', views.hello),
    path('admin/', admin.site.urls),
    ]
  • 设置模板路径,让Django框架找到模板所在目录

    我们由于返回了模板文件,所以我们需要对 mysite/settings.py 进行修改配置一下路径,至此,也就完成了一个最小的Django项目了!

    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'hello2app/templates')], # 指定templates所在路径
    'APP_DIRS': True,
    'OPTIONS': {
    'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    ],
    },
    },
    ]
  • django怎么用

    社区版和专业版区别在于,专业版可以直接进行Django项目的创建,而社区版则需要手动进行创建。鉴于我们都是刚入门,我们还是手动创建更好,更利于我们熟悉Django的命令和相关操作。

    新建 Django 的最小程序

    新建一个Web框架工程

    我们再命令行界面进到要创建项目的目录下,然后输入以下命令:

    django-admin startproject mysite

    这里的 django-admin 是一个用于管理 django 的工具,在我们安装 django 的过程中会默认进行依赖安装。 mysite 是工程名称,可以根据自己的需求进行修改。创建后,我们会得到以下的目录结构:

    最小的项目目录结构
    最小的项目目录结构

    修改工程,增加功能

    我们在这里需要增加具体应用,以及通过配置 路由映射 来进行相关功能的增加。

    工程(project)和应用(app)什么关系呢?

  • 工程对应于一个网站,是配置和应用的集合
  • 应用对应于特定功能,是具体功能的载体
  • 配置和功能分离是高度模块化的体现
    1. 【修改工程】创建一个具体应用(app)

    命令:python manage.py startapp helloapp

    命令执行完成后,会在根目录下新建一个helloapp的目录

    helloapp目录
    helloapp目录
    1. 【修改工程】修改应用的views.py

      # Create your views here.
      from django.http import HttpResponse

      def hello(request):
      return HttpResponse("Hello World! I am coming...")
    2. 【修改工程】修改URL路由

      在和项目命对应的目录下的 urls.py 文件中指定URL与处理函数之间的路径关系。

      from django.contrib import admin
      from django.urls import include, path
      from helloapp import views # from the subapp import related views

      urlpatterns = [ # config the routes like vue's vue-router
      path('admin/', admin.site.urls),
      path('index/', views.hello),
      ]

      我们首先需要引入对应app下的 views 文件,然后配置路由对应关系

    3. 【修改工程】修改URL路由

      path('index/', views.hello)

      这里的 第一个参数 表示url地址,我们这里的就会响应 域名/index/这个路径的访问; 第二个参数 则表示指定某个处理函数,例如这里我们制定了 views.hello

      访问页面
      访问页面

    运行工程

    python manage.py runserver

    运行后我们访问对应的路由,就会得到相应的返回信息;如果访问未配置的则会返回 404 notfound。

    不得不说的 django-adminmanage.py

    django-admin

    django-admin <command> [options]

    django-admin是一个Django框架全局的管理工具:

  • 建立并管理Django工程
  • 建立并管理Django工程使用的数据库
  • 控制调试或日志信息
  • 运行并维护Django工程
  • 我们也可以通过 django-admin help 命令来查看更多的功能

    manage.py

    python manage.py <command> [options]

    功能和 django-admin 类似,但是作用范围仅作用于当前项目。

    我们也可以通过 python manage.py help 命令来查看更多功能。

    最小程序的改进

    需求:返回一个HTML页面,而不是一个字符串
    思路:建立模板(T),对应特定请求,返回模板页面
    新建hello2app,通过index2来访问

    新建hello2app应用

    `python manage.py startapp hello2app`

    使用templateTest.html为返回页面,修改views.py

    ```python# hello2app/views.pyfrom django.shortcuts import renderdef hello(request): return render(request, "PYC01-HTMLJSDemo.html")```这里,`render()` 是一个打包函数,第一个参数是 request, 第二个参数是要返回的模板页面。
  • 在hello2app应用中,新增urls.py文件(本地路由文件)

    # hello2app/urls.py

    from django.urls import path
    from . import views # . 代表当前 app
    urlpatterns = [ # urlpatterns 变量名成是固定的
    path('', views.hello)
    ]
  • 在全局路由文件中增加对本应用路由文件的引用

    # mysite/urls.py

    from django.contrib import admin
    from django.urls import include, path
    # include()函数,用于引入其他路由文件
    from helloapp import views
    urlpatterns = [
    path('index2/', include('hello2app.urls')),
    # 将hello2app的局部路由增加到全局路由中
    path('index/', views.hello),
    path('admin/', admin.site.urls),
    ]
  • 设置模板路径,让Django框架找到模板所在目录

    我们由于返回了模板文件,所以我们需要对 mysite/settings.py 进行修改配置一下路径,至此,也就完成了一个最小的Django项目了!

    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'hello2app/templates')], # 指定templates所在路径
    'APP_DIRS': True,
    'OPTIONS': {
    'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    ],
    },
    },
    ]
  • 如何正确使用 Django Forms

    django forms是Django的表单处理库。依赖HttpRequest,它具有如下特点:

    (1)、快速自动生成HTML表单

    (2)、表单数据校验

    (3)、错误信息提示

    (4)、自动转换为python数据格式

    #coding=utf-8

    #forms.py

    from django import forms

    class ContactForm(forms.Form):

        name = forms.CharField(max_length=30)

        age = forms.IntegerField()

        email = forms.EmailField(required=False)

    django orm 怎么对现有的表结构操作

    pymysqlpymysql.install_as_MySQLdb()

    并在settings.py文件修改DATABASES:

    技术分享

     

    技术分享
    DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘xe‘, ‘USER‘: ‘a_user‘, #mysql的用户名 ‘PASSWORD‘: ‘a_password‘, #mysql的密码 ‘HOST‘: ‘‘, ‘PORT‘: ‘‘, }}
    DATABASES

    注意:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建。

    创建并生成数据库:

    python manage.py makemigrationspython manage.py migrate

    执行结果不报错就创建数据库成功了。

    ORM(对象关系映射)

    用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

    优点:

    1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

    2 可以避免一些新手程序猿写sql语句带来的性能问题。

    缺点:

    1 性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。

    2  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

     

    下面用一个大家惯用的书籍/作者/出版商的数据库结构例子来学习Django ORM的语法。

    表(模型)的创建:

    实例:我们来假定下面这些概念,字段和关系

    作者模型:一个作者有姓名。

    作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。

    出版商模型:出版商有名称,地址,所在城市,省,国家和网站。

    书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。

    在我们自己建的app项目下的models.py文件

    from django.db import modelsclass Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.CharField("地址", max_length=50) city = models.CharField(‘城市‘,max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: verbose_name = ‘出版商‘ verbose_name_plural = verbose_name def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1, choices=((0, ‘男‘),(1, ‘女‘),)) email = models.EmailField() address = models.CharField(max_length=50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2,default=10) def __str__(self): return self.title

    注意:记得在settings里的INSTALLED_APPS中加入我们自己创建的项目名,我的为‘app01’,然后再同步数据库。

    分析代码:

    1  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。

    2  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。

    3  模型之间的三种关系:一对一,一对多,多对多。

                 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;

                一对多:就是主外键关系;

                多对多:彼此一对多,自动创建第三张表

    4  模型常用的字段类型以及参数

    技术分享
    # AutoField# 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自动主键字段)# BooleanField# A true/false field. admin 用 checkbox 来表示此类字段.# CharField# 字符串字段, 用于较短的字符串.# # 如果要保存大量文本, 使用 TextField.# # admin 用一个 <input type="text"> 来表示此类字段 (单行输入).# # CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.# # CommaSeparatedIntegerField# 用于存放逗号分隔的整数值. 类似 CharField, 必须要有 maxlength 参数.# DateField# 一个日期字段. 共有下列额外的可选参数:# # Argument 描述# auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.# auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.# admin 用一个文本框 <input type="text"> 来表示该字段数据(附带一个 JavaScript 日历和一个"Today"快键.# # DateTimeField# 一个日期时间字段. 类似 DateField 支持同样的附加选项.# admin 用两上文本框 <input type="text"> 表示该字段顺序(附带JavaScript shortcuts). # # EmailField# 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数.# FileField# 一个文件上传字段.# # 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don‘t fill up the given directory).# # admin 用一个``<input type="file">``部件表示该字段保存的数据(一个文件上传部件) .# # 在一个 model 中使用 FileField 或 ImageField 需要以下步骤:# # 在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义 MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.# 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件.# 你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数.举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object.get_mug_shot_url }} 这样的方式得到图像的绝对路径.# FilePathField# 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.# # 参数 描述# path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. Example: "/home/images".# match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名. 注意这个正则表达式只会应用到 base filename 而不是路径全名. Example: "foo.*.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.# recursive 可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.# 这三个参数可以同时使用.# # 我已经告诉过你 match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:# # FilePathField(path="/home/images", match="foo.*", recursive=True)# ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif# # FloatField# 一个浮点数. 必须 提供两个 参数:# # 参数 描述# max_digits 总位数(不包括小数点和符号)# decimal_places 小数位数# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:# # models.FloatField(..., max_digits=5, decimal_places=2)# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:# # models.FloatField(..., max_digits=19, decimal_places=10)# admin 用一个文本框(<input type="text">)表示该字段保存的数据.# # ImageField# 类似 FileField, 不过要校验上传对象是否是一个合法图片.它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存.# # 该字段要求 Python Imaging Library.# # IntegerField# 用于保存一个整数.# # admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)# # IPAddressField# 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").# # admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)# # NullBooleanField# 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项.# # admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.# # PhoneNumberField# 一个带有合法美国风格电话号码校验的 CharField``(格式: ``XXX-XXX-XXXX).# PositiveIntegerField# 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的....所以字段名字取得不太好,无符号整数就对了嘛).# PositiveSmallIntegerField# 类似 PositiveIntegerField, 取值范围较小(数据库相关)# SlugField# "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs.# # 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. 在以前的 Django 版本,没有任何办法改变 50 这个长度.# # 这暗示了 db_index=True.# # 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-populate the slug, via JavaScript, in the object‘s admin form:# # models.SlugField(prepopulate_from=("pre_name", "name"))# prepopulate_from 不接受 DateTimeFields.# # admin 用一个``<input type="text">``表示 SlugField 字段数据(一个单行编辑框) # # SmallIntegerField# 类似 IntegerField, 不过只允许某个取值范围内的整数.(依赖数据库)# # TextField# 一个容量很大的文本字段.# # admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).# # TimeField# A time. Accepts the same auto-population options as DateField 和 DateTimeField.# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(附加一些JavaScript shortcuts).# # URLField# 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)# # USStateField# 一个两字母的美国州名缩写.# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)# # XMLField# 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema 的文件系统路径.
    模型常用的字段类型以及参数

     

    表的操作(增删改查):

      1  增(create  save)

    技术分享

    技术分享
    >>> from app01.models import *>>> Author.objects.create(name=‘Alvin‘)<Author: Alvin>>>> AuthorDetail.objects.create(sex=False,email=‘916852314@qq.com‘,address=‘bejing‘,birthday=‘1995-3-16‘,author_id=1)<AuthorDetail: AuthorDetail object>>>> pub=Publisher()>>> pub.name=‘河大出版社‘>>> pub.address=‘保定‘>>> pub.city=‘保定‘>>> pub.state_province=‘河北‘>>> pub.country=‘China‘>>> pub.website=‘http://www.beida.com‘>>> pub.save()
    View Code

    注意:如果每次创建一个对象,想显示对应的raw sql,需要在settings加上日志记录部分:

    技术分享
    LOGGING = {# ‘version‘: 1,# ‘disable_existing_loggers‘: False,# ‘handlers‘: {# ‘console‘:{# ‘level‘:‘DEBUG‘,# ‘class‘:‘logging.StreamHandler‘,# },# },# ‘loggers‘: {# ‘django.db.backends‘: {# ‘handlers‘: [‘console‘],# ‘propagate‘: True,# ‘level‘:‘DEBUG‘,# },# }# }
    View Code

    那么如何创建存在一对多或多对多关系的一本书的信息呢?

    技术分享

    技术分享
    >>> Book.objects.create(title=‘php‘,publisher=pub,publication_date=‘2017-7-7‘)<Book: php>>>> author1=Author.objects.get(id=1)>>> author2=Author.objects.get(name=‘alvin‘)>>> book=Book.objects.get(id=1)>>> book.authors.add(author1,author1)>>> book.authors.add(author1,author2)
    View Code

    2 改:

    update和save方法

     

    django之数据库orm

    标签:self   file   app   text   一对一   子目录   美国   基础   开发   

    django orm 怎么对现有的表结构操作

    pymysqlpymysql.install_as_MySQLdb()

    并在settings.py文件修改DATABASES:

    技术分享

     

    技术分享
    DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘xe‘, ‘USER‘: ‘a_user‘, #mysql的用户名 ‘PASSWORD‘: ‘a_password‘, #mysql的密码 ‘HOST‘: ‘‘, ‘PORT‘: ‘‘, }}
    DATABASES

    注意:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建。

    创建并生成数据库:

    python manage.py makemigrationspython manage.py migrate

    执行结果不报错就创建数据库成功了。

    ORM(对象关系映射)

    用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

    优点:

    1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

    2 可以避免一些新手程序猿写sql语句带来的性能问题。

    缺点:

    1 性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。

    2  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

     

    下面用一个大家惯用的书籍/作者/出版商的数据库结构例子来学习Django ORM的语法。

    表(模型)的创建:

    实例:我们来假定下面这些概念,字段和关系

    作者模型:一个作者有姓名。

    作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。

    出版商模型:出版商有名称,地址,所在城市,省,国家和网站。

    书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。

    在我们自己建的app项目下的models.py文件

    from django.db import modelsclass Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.CharField("地址", max_length=50) city = models.CharField(‘城市‘,max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: verbose_name = ‘出版商‘ verbose_name_plural = verbose_name def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1, choices=((0, ‘男‘),(1, ‘女‘),)) email = models.EmailField() address = models.CharField(max_length=50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2,default=10) def __str__(self): return self.title

    注意:记得在settings里的INSTALLED_APPS中加入我们自己创建的项目名,我的为‘app01’,然后再同步数据库。

    分析代码:

    1  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。

    2  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。

    3  模型之间的三种关系:一对一,一对多,多对多。

                 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;

                一对多:就是主外键关系;

                多对多:彼此一对多,自动创建第三张表

    4  模型常用的字段类型以及参数

    技术分享
    # AutoField# 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自动主键字段)# BooleanField# A true/false field. admin 用 checkbox 来表示此类字段.# CharField# 字符串字段, 用于较短的字符串.# # 如果要保存大量文本, 使用 TextField.# # admin 用一个 <input type="text"> 来表示此类字段 (单行输入).# # CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.# # CommaSeparatedIntegerField# 用于存放逗号分隔的整数值. 类似 CharField, 必须要有 maxlength 参数.# DateField# 一个日期字段. 共有下列额外的可选参数:# # Argument 描述# auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.# auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.# admin 用一个文本框 <input type="text"> 来表示该字段数据(附带一个 JavaScript 日历和一个"Today"快键.# # DateTimeField# 一个日期时间字段. 类似 DateField 支持同样的附加选项.# admin 用两上文本框 <input type="text"> 表示该字段顺序(附带JavaScript shortcuts). # # EmailField# 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数.# FileField# 一个文件上传字段.# # 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don‘t fill up the given directory).# # admin 用一个``<input type="file">``部件表示该字段保存的数据(一个文件上传部件) .# # 在一个 model 中使用 FileField 或 ImageField 需要以下步骤:# # 在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义 MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.# 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件.# 你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数.举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object.get_mug_shot_url }} 这样的方式得到图像的绝对路径.# FilePathField# 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.# # 参数 描述# path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. Example: "/home/images".# match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名. 注意这个正则表达式只会应用到 base filename 而不是路径全名. Example: "foo.*.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.# recursive 可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.# 这三个参数可以同时使用.# # 我已经告诉过你 match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:# # FilePathField(path="/home/images", match="foo.*", recursive=True)# ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif# # FloatField# 一个浮点数. 必须 提供两个 参数:# # 参数 描述# max_digits 总位数(不包括小数点和符号)# decimal_places 小数位数# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:# # models.FloatField(..., max_digits=5, decimal_places=2)# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:# # models.FloatField(..., max_digits=19, decimal_places=10)# admin 用一个文本框(<input type="text">)表示该字段保存的数据.# # ImageField# 类似 FileField, 不过要校验上传对象是否是一个合法图片.它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存.# # 该字段要求 Python Imaging Library.# # IntegerField# 用于保存一个整数.# # admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)# # IPAddressField# 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").# # admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)# # NullBooleanField# 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项.# # admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.# # PhoneNumberField# 一个带有合法美国风格电话号码校验的 CharField``(格式: ``XXX-XXX-XXXX).# PositiveIntegerField# 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的....所以字段名字取得不太好,无符号整数就对了嘛).# PositiveSmallIntegerField# 类似 PositiveIntegerField, 取值范围较小(数据库相关)# SlugField# "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs.# # 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. 在以前的 Django 版本,没有任何办法改变 50 这个长度.# # 这暗示了 db_index=True.# # 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-populate the slug, via JavaScript, in the object‘s admin form:# # models.SlugField(prepopulate_from=("pre_name", "name"))# prepopulate_from 不接受 DateTimeFields.# # admin 用一个``<input type="text">``表示 SlugField 字段数据(一个单行编辑框) # # SmallIntegerField# 类似 IntegerField, 不过只允许某个取值范围内的整数.(依赖数据库)# # TextField# 一个容量很大的文本字段.# # admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).# # TimeField# A time. Accepts the same auto-population options as DateField 和 DateTimeField.# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(附加一些JavaScript shortcuts).# # URLField# 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)# # USStateField# 一个两字母的美国州名缩写.# # admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)# # XMLField# 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema 的文件系统路径.
    模型常用的字段类型以及参数

     

    表的操作(增删改查):

      1  增(create  save)

    技术分享

    技术分享
    >>> from app01.models import *>>> Author.objects.create(name=‘Alvin‘)<Author: Alvin>>>> AuthorDetail.objects.create(sex=False,email=‘916852314@qq.com‘,address=‘bejing‘,birthday=‘1995-3-16‘,author_id=1)<AuthorDetail: AuthorDetail object>>>> pub=Publisher()>>> pub.name=‘河大出版社‘>>> pub.address=‘保定‘>>> pub.city=‘保定‘>>> pub.state_province=‘河北‘>>> pub.country=‘China‘>>> pub.website=‘http://www.beida.com‘>>> pub.save()
    View Code

    注意:如果每次创建一个对象,想显示对应的raw sql,需要在settings加上日志记录部分:

    技术分享
    LOGGING = {# ‘version‘: 1,# ‘disable_existing_loggers‘: False,# ‘handlers‘: {# ‘console‘:{# ‘level‘:‘DEBUG‘,# ‘class‘:‘logging.StreamHandler‘,# },# },# ‘loggers‘: {# ‘django.db.backends‘: {# ‘handlers‘: [‘console‘],# ‘propagate‘: True,# ‘level‘:‘DEBUG‘,# },# }# }
    View Code

    那么如何创建存在一对多或多对多关系的一本书的信息呢?

    技术分享

    技术分享
    >>> Book.objects.create(title=‘php‘,publisher=pub,publication_date=‘2017-7-7‘)<Book: php>>>> author1=Author.objects.get(id=1)>>> author2=Author.objects.get(name=‘alvin‘)>>> book=Book.objects.get(id=1)>>> book.authors.add(author1,author1)>>> book.authors.add(author1,author2)
    View Code

    2 改:

    update和save方法

     

    django之数据库orm

    标签:self   file   app   text   一对一   子目录   美国   基础   开发   

    django 怎么从数据库读数据,成为表单默认值

    最简单的办法是。为数据库的表建立一个model。具体做法是这样子。

    1.在settings.py里设置数据库连接方式。连接错误后面都没有办法

    2.在models设置一个数据库表的对应数据结构,通常叫关系对象模型,所以叫model,它就是一个类。你可以用django-admin.py ...probe,似乎是这个命令,就是一个数据库的探测命令,可以根据表,自动生成model的代码。当然如果你先写了model的代码就可以用syncdb命令生成数据库的表

    3.在urls.py里设置一个URL的path,当浏览器访问这个path时就可以打开对应的view中的函数

    4.在view里

    4.1 result=modelclass.objects.all()这个命令可以取出所有的记录

    4.2 然后你可以直接将结果传递给模板。由模板显示。这是最合理的办法

    4.3 在模板里 {% for cols in result %}

    4.4 <li>cols.field1</li>

    大约就是这样子。可能说的太粗。你对着教程看就知道了。

    django利用modelform生成表单的问题?

    如果你使用 Django 的模型表单 (model form) 生成表单,可以使用 Django 查询数据库进行筛选,以便仅显示与特定用户相关的分类。
    首先,在视图函数中,查询数据库并返回与特定用户相关的分类:
    from django.shortcuts import render
    from .models import Category
    def my_view(request):
    user_categories = Category.objects.filter(user=request.user)
    return render(request, 'my_template.html', {'categories': user_categories})
    然后,在模板中,您可以在生成表单时使用该分类集:
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>
    最后,在表单类中,您可以重写初始化方法,以仅使用用户分类:
    from django import forms
    from .models import Table2
    class Table2Form(forms.ModelForm):
    class Meta:
    model = Table2
    fields = ('category',)
    def __init__(self, user, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['category'].queryset = Category.objects.filter(user=user)
    最后,在视图函数中实例化表单,并将用户传递给表单类:
    from django.shortcuts import render
    from .forms import Table2Form
    def my_view(request):
    user_categories = Category.objects.filter(user=request.user)
    form = Table2Form(request.user, instance=table2_instance)
    return render(request, 'my_template.html', {'form': form})

    django利用modelform生成表单的问题?

    如果你使用 Django 的模型表单 (model form) 生成表单,可以使用 Django 查询数据库进行筛选,以便仅显示与特定用户相关的分类。
    首先,在视图函数中,查询数据库并返回与特定用户相关的分类:
    from django.shortcuts import render
    from .models import Category
    def my_view(request):
    user_categories = Category.objects.filter(user=request.user)
    return render(request, 'my_template.html', {'categories': user_categories})
    然后,在模板中,您可以在生成表单时使用该分类集:
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>
    最后,在表单类中,您可以重写初始化方法,以仅使用用户分类:
    from django import forms
    from .models import Table2
    class Table2Form(forms.ModelForm):
    class Meta:
    model = Table2
    fields = ('category',)
    def __init__(self, user, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['category'].queryset = Category.objects.filter(user=user)
    最后,在视图函数中实例化表单,并将用户传递给表单类:
    from django.shortcuts import render
    from .forms import Table2Form
    def my_view(request):
    user_categories = Category.objects.filter(user=request.user)
    form = Table2Form(request.user, instance=table2_instance)
    return render(request, 'my_template.html', {'form': form})

    Django中一个项目里怎么使用两个数据库 在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。

    1. 修改项目的 settings 配置

    在settings.py中配置需要连接的多个数据库连接串

    2. 设置数据库的路由规则方法

    在settings.py中配置DATABASE_ROUTERS

    1DATABASE_ROUTERS=[‘Prject.database_router.DatabaseAppsRouter‘]

    Project: 建立的django项目名称(project_name)

    database_router: 定义路由规则database_router.py文件名称, 这个文件名可以自己定义

    DatabaseAppsRouter: 路由规则的类名称,这个类是在database_router.py文件中定义

    3. 设置APP对应的数据库路由表

    每个APP要连接哪个数据库,需要在做匹配设置,在settings.py文件中做如下配置:

    以上的report,regs是项目中的 APP名,分别指定到 ora1, default的数据库。

    为了使django自己的表也创建到你自己定义的数据库中,你可以指定 : admin, auth, contenttypes, sessions 到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中.

    4. 创建数据库路由规则

    在项目工程根路径下(与 settings.py 文件一级)创建database_router.py文件:

    5.原生sql的使用:

    6. Models创建样例

    在各自的 APP 中创建数据表的models时,必须要指定表的 app_label 名字,如果不指定则会创建到default中配置的数据库名下,

    如下:

    在app01下创建models

    在app02下创建models

    7. 生成数据表

    在使用django的 migrate 创建生成表的时候,需要加上 _database 参数,如果不加则将 未 指定 app_label 的 APP的models中的表创建到default指定的数据库中,如:

    将app01下models中的表创建到db01的数据库”db_01”中

    ./ manage.py migrate--database=db01

    将app02下models中的表创建到db02的数据库”db_02”中

    ./ manage.py migrate--database=db02

    将app03下models中的表创建到default的数据库”sqlite3”中

    ./ manage.py migrate

    以上创建完成后,其它所有的创建、查询、删除等操作就和普通一样操作就可以了,无需再使用类似

    models.User.objects.using(dbname).all()

    这样的方式来操作

    Django中一个项目里怎么使用两个数据库

    标签:DBNamerate数据库连接image生成report查询、删除ESS名称

    显示全文