Django 通过 ORM 实现表的CRUD

Django 通过 ORM 实现表的CRUD

单表的创建
  1. 修改 setting.py 文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名称',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
  1. 修改应用下面对应的models.py 文件
class Book(models.Model):
    nid = models.AutoField(primary_key=True)  # 表ID 自增主键
    title = models.CharField(max_length=32)  # 字符串,最大长度为32
    price = models.DecimalField(max_digits=8, decimal_places=2)  # 小数,最多8位,小数点最多2位
    publish = models.CharField(max_length=32)
    pub_date = models.DateTimeField()
  1. 修改在与 setting.py 同级的目录下的 _ _init__.py 文件
import pymysql

pymysql.install_as_MySQLdb()
  1. 执行以下脚本在应用下创建 migrations 包以及相应的类
python manage.py makemigrations
  1. 执行以下脚本会在数据库中创建 INSTALLED_APPS 中所有对应的数据表
python manage.py migrate
Django 数据的插入(PS:要先完成表的生成)
  • 修改 urls.py 文件
from django.contrib import admin
from django.urls import path
from vedio import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
]
  • 修改 views.py 文件
from django.shortcuts import render,HttpResponse,redirect
from vedio.models import Book

def add(request):

    # 方法一
    """
    book = Book(title="Django", price=123, pub_date="2019-10-06", publish="人民出版社")
    book.save()
    """
    # 方法二
    Book.objects.create(title="Think PHP", price=123, pub_date="2019-10-06", publish="人民出版社")
    # 方法三
    """
    Book.objects.create(**request.POST.dict())
    PS:request.POST 要删除 {{ csrf-token }} 引进了的变量
    """
    return HttpResponse("OK")
Django 数据的查询,删除,修改
  • 修改 views.py 文件
from django.shortcuts import render,HttpResponse,redirect
from vedio.models import Book

def books(request):
    # books = Book.objects.all()  # 返回所有记录
    books = Book.objects.filter(title="Think PHP")  # 查询标题等于 Think PHP的所有记录
    # Book.objects.filter(title="Think PHP").delete()  # 删除标题为 Think PHP的所有条记录
    # Book.objects.filter(nid=1).update(price=120)  # 更新 nid=1 这条数据的price
    return render(request, "books.html", locals())
  • 修改 urls.py 文件
from django.contrib import admin
from django.urls import path
from vedio import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', views.books),
]
Django 查询深入
from django.shortcuts import render,HttpResponse,redirect
from vedio.models import Book

def books(request):

    # all()
    # books = Book.objects.all()  # 返回所有记录

    # filter()
    # books = Book.objects.filter(title="Think PHP")  # 查询标题等于 Think PHP的所有记录
    # books = Book.objects.filter(title="Think PHP", nid=2)  # 查询标题等于 Think PHP 并且 nid = 2 的所有记录

    # get()
    # books = Book.objects.get(title="Think PHP")  # 查询标题等于 Think PHP 的一条记录,大于1条或1条都没有将报错

    # first() last()
    # books = Book.objects.all().first()  # 返回 queryset 的第一个 model 对象
    # books = Book.objects.all().last()  # 返回 queryset 的最后一个 model 对象

    # exclude()
    # books = Book.objects.exclude(title="Django")  # 查询 title 不等于 Django 的 querySet

    # order_by()
    # books = Book.objects.all().order_by('price')  # 根据price 升序
    # books = Book.objects.all().order_by('-price')  # 根据price 降序

    # count()
    # books_num = Book.objects.all().count()  # 返回书籍的个数

    # reverse()
    # books = Book.objects.all().reverse()  # 逆序

    # exits()
    # is_exits = Book.objects.all().exists()  # 判断数据表是否有数据

    # values()
    # ret = Book.objects.all().values('title', 'price')  # 取 title price 的数据,返回一个列表,列表里面的数据是字典

    # values_list()
    # ret = Book.objects.all().values_list('title', 'price')  # 取 title price 的数据,返回一个列表,列表里面的数据是元组

    # distinct()
    # books = Book.objects.all().values("title").distinct()  # 对 title 中的数据进行去重

    # __gt __lt __gte __lte
    # books = Book.objects.filter(price__gt=200)  # 查询 price 大于200 的数据
    # books = Book.objects.filter(price__gte=200)  # 查询 price 大于等于200 的数据
    # books = Book.objects.filter(price__lt=200)  # 查询 price 小于200 的数据
    # books = Book.objects.filter(price__lte=200)  # 查询 price 小于等于200 的数据

    # __startswith __istartswith __contains __icontains
    # books = Book.objects.filter(title__startswith="Think")  # 查询 title 以 Think 开头的数据
    # books = Book.objects.filter(title__istartswith="think")  # 查询 title 以 Think 开头的数据,不区分大小写
    # books = Book.objects.filter(title__contains="Think")  # 查询 包含 Think 的数据

    return render(request, "books.html", locals())
Django 一对多表的创建
  • 修改应用下的models.py 文件
from django.db import models
class Book(models.Model):
    nid = models.AutoField(primary_key=True)  # 表ID 自增主键
    title = models.CharField(max_length=32)  # 字符串,最大长度为32
    price = models.DecimalField(max_digits=8, decimal_places=2)  # 小数,最多8位,小数点最多2位
    pub_date = models.DateTimeField()
    publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE)  # on_delete=models.CASCADE 指定级联删除

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32, null=True)  # null=True表示该字段可以为空
Django 多对多表的创建
  • 修改应用下的 models.py 文件
from django.db import models
class Book(models.Model):
    nid = models.AutoField(primary_key=True)  # 表ID 自增主键
    title = models.CharField(max_length=32)  # 字符串,最大长度为32
    price = models.DecimalField(max_digits=8, decimal_places=2)  # 小数,最多8位,小数点最多2位
    pub_date = models.DateTimeField()
    publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE)  # on_delete=models.CASCADE 指定级联删除
    authors = models.ManyToManyField(to="Author")  # 指定多对多

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    email = models.CharField(max_length=32)
Django 一对一表的创建
  • 修改应用下的 models.py 文件
from django.db import models
class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    email = models.CharField(max_length=32)
    ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    addr = models.CharField(max_length=32)
    tel = models.IntegerField()
Django 一对多数据的插入
Book.objects.create(title="Python")
Django 多对多数据的插入
book = Book.objects.create(title="Django")

# 方法一
zp = Author.objects.filter(name="zp").first()
mcx = Author.objects.filter(name="mcx").first()
book.authors.add(zp, mcx)

# 方法二
book.authors.add(1, 2)

# 方法三
book.authors.add(*[1, 2])
Django 多对多数据的解除绑定
book = Book.objects.filter(title="Django").first()
mcx = Author.objects.filter(name="mcx").first()
book.authors.remove(mcx)  # 删除 与 book 关联的 mcx
book.authors.clear()  # 删除 与 book 关联的所有作者
Django 多对多数据的解除再绑定
book = Book.objects.filter(title="Django").first()

# 方法一
book.authors.clear()
book.authors.add(1)

# 方法二
book.authors.set(1)

原文地址:https://www.cnblogs.com/GetcharZp/p/11630970.html

时间: 2024-10-08 20:16:21

Django 通过 ORM 实现表的CRUD的相关文章

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

python——Django(ORM连表操作)

一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption username = models.CharField(max_length=32) age = models.IntegerField() 增: 1.外键

Django之ORM跨表操作

一.准备数据库 models.py文件内容: from django.db import models # Create your models here. class Book(models.Model):     title=models.CharField(max_length=32)     price=models.DecimalField(max_digits=6,decimal_places=2)     create_time=models.DateField()     mem

Django学习【第6篇】:Django之ORM单表操作(增删改查)

django之数据库表的单表查询 一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save() # 方式二: models.Student.objects.create(name ="海燕",co

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

055.Python前端Django模型ORM多表基本操作

一 准备工作 1.1 新建一个项目 [email protected]:~# cd /root/PycharmProjects/ [email protected]:~/PycharmProjects# django-admin startproject orm_demo [email protected]:~/PycharmProjects# ll drwxr-xr-x 7 root root 4096 4月 5 20:04 mysite/ drwxr-xr-x 3 root root 409

django之ORM跨表

跨表   正:        1. q = UserInfo.objects.all().first()     q.ug.title         2.      UserInfo.objects.values('nid','ug_id')                   UserInfo.objects.values('nid','ug_id','ug__title')          3. UserInfo.objects.values_list('nid','ug_id','ug

Django 数据库ORM 操作 - 字段的类型和参数

通过Django的ORM创建表的时候,我们需要定义自己的类. 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下. 首先看看字段的类型.尽管Python提供了近乎20种类型,他转换成数据库表之后,其实本质就是4个类型:字符串,数字,时间和二进制. AutoField(Field)     - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField)     - bigint自增列,必须填入参数 prim