• Django项目之模型增删改查操作(CRUD)


      模型创建之后,Django自动为我们的模型生成了一套完整、方便、高效的API,用来对数据进行增删改查。

      接下来我们结合之前创建的Modles来进行介绍,下面是我们的Models代码:

    from django.db import models
    from django.contrib.auth.models import User 
    #导入Django自带用户模块
    
    # 文章分类
    class Category(models.Model):
        name = models.CharField('博客分类', max_length=100)
        index = models.IntegerField(default=999, verbose_name='分类排序')
    
        class Meta:
            verbose_name = '博客分类'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    #文章标签
    class Tag(models.Model):
        name = models.CharField('文章标签',max_length=100)
        class Meta:
            verbose_name = '文章标签'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    #推荐位
    class Tui(models.Model):
        name = models.CharField('推荐位',max_length=100)
    
        class Meta:
            verbose_name = '推荐位'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    
    #文章
    class Article(models.Model):
        title = models.CharField('标题', max_length=70)
        excerpt = models.TextField('摘要', max_length=200, blank=True)
        category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类', blank=True, null=True)
         #使用外键关联分类表与分类是一对多关系
        tags = models.ManyToManyField(Tag,verbose_name='标签', blank=True)
        #使用外键关联标签表与标签是多对多关系
        img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章图片', blank=True, null=True)
        body = models.TextField()
        user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
         """
         文章作者,这里User是从django.contrib.auth.models导入的。
         这里我们通过 ForeignKey 把文章和 User 关联了起来。
         """
        views = models.PositiveIntegerField('阅读量', default=0)
        tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推荐位', blank=True, null=True)
        
        created_time = models.DateTimeField('发布时间', auto_now_add=True)
        modified_time = models.DateTimeField('修改时间', auto_now=True)
    
        class Meta:
            verbose_name = '文章'
            verbose_name_plural = '文章'
    
        def __str__(self):
            return self.title

    1.基础准备

      我们先来配置下URL:

    myblog/views.py
    
    from django.contrib import admin
    from django.urls import path
    from blog import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('orm/', views.orm, name='orm'),    # 新增
    ]

    再添加一个与URL对应的视图函数:

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    def orm(request):
    
        return HttpResponse('orm')

    在浏览器中访问http://127.0.0.1:8000/orm/ ,就会在浏览器中看到输入“orm”。我们这么做的目的是一会我们进行数据操作的方法全都写在orm这个视图函数中,这样通过访问URL就可以触发视图函数,从而来验证我们的效果。

     2.新增数据(add)

    blog/views.py
    
    from django.shortcuts import render, HttpResponse
    from .models import Article
    
    # Create your views here.
    def orm(request):
        # 增加一篇文章
        Article.objects.create(title='标题一', excerpt='摘要一', body='正文一', category_id=4, tui_id=2, user_id=1)
        return HttpResponse('orm')

    在进行新增操作之前,数据库中文章内容如下:

     在浏览器中访问http://127.0.0.1:8000/orm/,触发视图函数orm后,刷新数据库查看效果:

     从上面的图中可以看到我们已经成功添加了一篇文章,证明我们新增文章成功。

    数据新增的方法有三种:

    blog/views.py
    
    from django.shortcuts import render, HttpResponse
    from .models import Article
    
    # Create your views here.
    def orm(request):
        # 第一种方法:
        # Article.objects.create(title='标题一', excerpt='摘要一', body='正文一', category_id=4, tui_id=2, user_id=1)
        # 第二种方法:添加数据,实例化表类,在实例化里传参为字段和值
        obj = Article(title='标题二', excerpt='摘要二', body='正文二', user_id=1, category_id=4, tui_id=2, )
        # 写入数据库
        obj.save()
        # 第三种方法:将要写入的数据组合成字典,键为字段,值为数据
        dic = {'title': '标题三', 'excerpt': '摘要三', 'body': '正文三', 'category_id': '4', 'tui_id': '2', 'user_id': '1'}
        # 添加到数据库,注意字典变量名称一定要加**
        Article.objects.create(**dic)
        return HttpResponse('orm')

    使用第二和第三种方法增加数据,刷新页面之后,数据库效果如下:

     我们看到,数据库里已经增加了两条数据。

    严格来说,增加数据只有两种:create( )方法和save( )方法。一般我们推荐使用第三种方法

    3.删除数据(delete)

    from django.shortcuts import render, HttpResponse
    from .models import Article
    
    # Create your views here.
    def orm(request):
        # 删除id为8的文章(数据)
        Article.objects.filter(id=8).delete()
        return HttpResponse('orm')

    删除之前:

     删除之后:

     从上图可以看到ID为8的文章已经被删除了。

    4.更新数据(update)

    from django.shortcuts import render, HttpResponse
    from .models import Article
    
    # Create your views here.
    def orm(request):
        # 把id=7的文章标题,修改成'我是被修改后的标题二'。将指定条件的数据更新,支持 **kwargs,支持字典。
        Article.objects.filter(id=7).update(title='我是被修改后的标题二')
        return HttpResponse('orm')

    修改之前:

     修改之后:

     从上图可以看到ID=7的文章标题被修改成功了!

    5.查询数据

    from django.shortcuts import render, HttpResponse
    from .models import Article
    
    # Create your views here.
    def orm(request):
        # 查询所有数据,查询结果为QuerySet,返回当前表中的所有记录
        # articles = Article.objects.all()
    
        # 使用filter()方法过滤指定条件的记录
        # article = Article.objects.filter(id=1)
    
        # 使用get()方法查询指定条件的记录
        article = Article.objects.get(id=1)
        return HttpResponse('orm')

    Django提供的查询API还有很多,这里就不一一介绍了,后续再整理!

  • 相关阅读:
    [转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
    [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
    JDE Develop Server分别安装DV PY PD后WEBSERVER问题
    [转]Java 8:不要再用循环了
    查找-find -grep
    长度有限制的字符串hash函数
    oracle 中proc和oci操作对缓存不同处理
    反编译.o到.cpp
    类的对象在外部访问它自己的私有成员变量没问题吗?
    strcpy(),string使用问题
  • 原文地址:https://www.cnblogs.com/lwjnicole/p/12324448.html
Copyright © 2020-2023  润新知