Django – 插入数据



Django 有自己的对象关系模型 (ORM),它将 Python 类与关系数据库中的表映射起来。ORM 机制有助于以面向对象的方式执行 CRUD 操作。在本章中,我们将学习插入新数据的方法。

默认情况下,Django 使用 SQLite 数据库。Django 中的模型是从“django.db.models”类继承的类。

让我们在“models.py”文件中使用以下Dreamreal 模型来学习如何在映射的表中插入数据:

from django.db import models

class Dreamreal(models.Model):
   website = models.CharField(max_length=50)
   mail = models.CharField(max_length=50)
   name = models.CharField(max_length=50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "dreamreal"

声明模型后,我们需要执行迁移

python manage.py makemigrations
python manage.py migrate

从 Shell 插入对象

Django 具有一个有用的功能,您可以使用它在 Django 项目的环境中调用 Python shell。使用manage.py脚本的 shell 命令:

python manage.py shell

在 Python 提示符前,导入 Dreamreal 模型:

>>> from myapp.models import Dreamreal

我们可以构造此类的对象并调用其 save() 方法,以便在表中添加相应的行

>>> obj = Dreamreal(website="www.polo.com", mail="[email protected]", name="sorex", phonenumber="002376970")
>>> obj.save()

我们可以通过在任何 SQLite 查看器中打开数据库来确认这一点。

您还可以使用模型类的对象属性的 create() 方法插入记录。

>>> obj = Dreamreal.objects.create(website="www.polo.com", 
mail="[email protected]", name="sorex", phonenumber="002376970")

通过调用视图函数执行插入操作

现在让我们通过调用视图函数来执行插入操作。在views.py文件中定义addnew()函数,如下所示:

from myapp.models import Dreamreal

def addnew(request):
   obj = Dreamreal(website="www.polo.com", mail="[email protected]", name="sorex", phonenumber="002376970")
   obj.save()
   return HttpResponse("<h2>Record Added Successfully")

我们需要将此视图注册到 URLpatterns 列表中。

from django.urls import path
from . import views

urlpatterns = [
   path("", views.index, name="index"),
   path("addnew/", views.addnew, name='addnew')
]

与其像上述示例中那样使用硬编码值,不如希望从用户那里接受数据。为此,在myform.html文件中创建一个 HTML 表单。

<html>
<body>
   <form action="../addnew/" method="post">
      {% csrf_token %}
      <p><label for="website">WebSite: </label>
      <input id="website" type="text" name="website"></p>
      <p><label for="mail">Email: </label>
      <input id="mail" type="text" name="mail"></p>
      <p><label for="name">Name: </label>
      <input id="name" type="text" name="name"></p>
      <p><label for="phonenumber">Phone Number: </label>
      <input id="phonenumber" type="text" name="phonenumber"></p>
      <input type="submit" value="OK">
   </form>
</body>
</html>

HTML 模板文件必须存储在 TEMPLATES 设置中定义的目录中:

TEMPLATES = [
   {
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [BASE_DIR/'templates'],
   .. . .,
]

让我们使用 render() 函数显示表单模板:

from django.shortcuts import render
from myapp.models import Dreamreal

def addnew(request):
   if request.method == "POST":
      ws = request.POST['website']
      mail = request.POST['mail']
      nm = request.POST['name']
      ph = request.POST['phonenumber']
      obj = Dreamreal(website=ws, mail=mail, name=nm, phonenumber=ph)
      obj.save()
      return HttpResponse("<h2>Record Added Successfully</h2>")
   return render(request, "myform.html")

请注意,表单的 action 属性也设置为映射 addnew() 函数的相同 URL。因此,我们需要检查 request.method。如果是 GET 方法,则呈现空白表单。如果是 POST 方法,则解析表单数据并将其用于插入新记录。

Django Insert Data 1

模型表单

Django 有一个ModelForm类,它会自动呈现一个 HTML 表单,其结构与模型类的属性匹配。

我们在应用文件夹下的forms.py文件中定义了一个DreamRealForm类,它使用Dreamreal 模型作为基础。

from django import forms
from .models import Dreamreal

class DreamrealForm(forms.ModelForm):
   class Meta:
      model = Dreamreal
      fields = "__all__"

模型表单的对象在 HTML 表单上呈现。如果请求方法是 POST,则 ModelForm 类的 save() 方法会自动验证表单并保存新记录。

from .forms import DreamrealForm
def addnew(request):
   if request.method == 'POST':
      form = DreamrealForm(request.POST)
      if form.is_valid():
         form.save()
            return HttpResponse("<h2>Book added successfully</h2>")

   context={'form' : DreamrealForm}
   return render(request, "myform.html", context)
Django Insert Data 2

CreateView 类

Django 定义了一组通用视图类。CreateView类专门用于执行 INSERT 查询操作。

我们定义CreateView类的子类,并将它的template_name属性设置为我们已经创建的myform.html

views.py文件中添加以下代码:

from django.views.generic import CreateView
class DRCreateView(CreateView):
   model = Dreamreal
   fields = "__all__"
   template_name = 'myform.html'
   success_url = '../success/'

插入成功后,浏览器将重定向到 success() 视图函数。

def success(request):
   return HttpResponse("<h2>Book added successfully</h2>")

上述两个视图都必须包含在urls.py文件的 URL 模式列表中。通用视图类使用它们的 as_view() 方法注册。

from django.urls import path
from . import views
from .views import DRCreateView

urlpatterns = [
   path("", views.index, name="index"),
   path("addnew/", views.addnew, name='addnew'),
   path("add/", DRCreateView.as_view(), name='add'),
   path("success/", views.success, name='success'),
]

在本章中,我们学习了在 Django 模型中插入数据的不同方法。

广告