Django学习【第5篇】:Django之ORM数据库操作注意细节

自己没有记住的一点小知识(ORM查询相关)

一、多对多的正反向查询

class Class(models.Model):
    name = models.CharField(max_length=32,verbose_name="班级名")
    course = models.CharField(verbose_name="课程",max_length=32)
    def __str__(self):
        return self.name

class Teacher(models.Model):
    name = models.CharField(max_length=23,verbose_name="姓名")
    classes = models.ManyToManyField(verbose_name="所属班级",to="Class")
    def __str__(self):
        return self.name

题目1:查找娜娜老师所带的班级

        # 方式一:基于对象的查找
        obj = models.Teacher.objects.filter(name="娜娜").first()
        print(obj.classes.all())
        print("娜娜老师带的班级",obj.classes.values("name"))
        # 方式二:基于双下划线的查找
        obj_cls = models.Teacher.objects.filter(name="娜娜").values("classes__name")
        print("娜娜老师带的班级",obj_cls)

注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。我就是犯了这样的错,引以为戒。。

总结:不管是一对多,还是多对多,要是查询多得一方就得用all()

运行结果截图:

表结构:

from django.db import models

# Create your models here.
# 一个学生有一个班级,一个班级可以有好多学生,所以是
# 一对多的关系,关联字段放在多的一方
class Student(models.Model):
    name = models.CharField(max_length=32,verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    classes = models.ForeignKey(to="Class",verbose_name="所属班级")
    def __str__(self):
        return self.name

class Class(models.Model):
    name = models.CharField(max_length=32,verbose_name="班级名")
    course = models.CharField(verbose_name="课程",max_length=32)
    def __str__(self):
        return self.name

class Teacher(models.Model):
    name = models.CharField(max_length=23,verbose_name="姓名")
    classes = models.ManyToManyField(verbose_name="所属班级",to="Class")
    def __str__(self):
        return self.name

2、查询海燕在那个班级

  # 方式一:
    print("海燕所在的班级",models.Student.objects.filter(name="海燕").values("classes__name"))
    # 方式二:
    obj_cls = models.Student.objects.filter(name="海燕").first()
    print("海燕所在的班级",obj_cls.classes.name)

3、查询海燕所在班的老师的姓名

  print("海燕所在班的老师的姓名",models.Student.objects.filter(name="海燕").values("classes__teacher__name"))

4、查询软件测试151班的所有学生的姓名

 print("软件测试151班的所有学生的姓名",models.Class.objects.filter(name="软件测试151").values("student__name"))
 obj = models.Class.objects.filter(name="软件测试151").first()
 # print("软件测试151班的所有学生的姓名",obj.student_set.name)  #这样打印的结果是None
 print("软件测试151班的所有学生的姓名",obj.student_set.all().values("name"))

二、需要掌握的一个很重要的知识点

1、form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响

  <button class="login" type="button">注册</button>

<button type="button" onclick="doValidation();">提交</button>
<input type="button" onclick="doValidation();" value="提交"/>
上面两种写法是对的,功能一样。

<button onclick="doValidation();">提交</button>
如果写成这种,默认为submit,本来doValidation方法里有提交功能了,
再加上按钮也是提交功能,会提交两次。所以使用按钮时最好指定type类型。

原文地址:https://www.cnblogs.com/kcwxx/p/10156053.html

时间: 2024-08-02 13:07:59

Django学习【第5篇】:Django之ORM数据库操作注意细节的相关文章

Django学习【第5篇】:Django之ORM数据库操作

django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例化对象 ORM的两大功能: 操作表: - 创建表 - 修改表 - 删除表 操作数据行: - 增删改查 ORM利用pymysql第三方工具链接数据库 Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去链接 二.创建表之前的准备工作 一.自己创建数据库

Django学习之配置篇

Django之路:安装与配置 MTV Model Template View 数据库 模版文件 业务处理 了解Django框架,功能齐全 一.安装Django&Django基本配置 安装Django pip3 django 配置Django 1.配置Django环境变量 D:\Program files\python37 D:\Program files\python37\Lib\site-packages\django\bin D:\Program files\python37\Scripts

django学习~第四篇

django表单   1  今天继续来学学django的表单       首先介绍下http的方法,这是最基本的       GET 方法 GET一般用于获取/查询 资源信息,以?分割URL和传输数据,多个参数用&连接,login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD GET提交的数据会在地址栏中显示出来       POST 方法 而POST一般用于更新 资源信息 把提交的数据放置在是HTT

django学习~第五篇

一 简介:之前我们都是大概了解了下django本身和一些基本功能 这次我们深入一些聊        model模块 此处不考虑外键等特殊情况       今天来实现用户注册界面       1 常见的具体字段介绍            AutoField 自增列            CharField 字符类型            BooleanField 布尔类型            DateTimeField 日期类型           IntegerField 整型       2

【Django】ORM数据库操作

Django-ORM数据库操作 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例化对象 ORM的两大功能: 操作表: - 创建表 - 修改表 - 删除表 操作数据行: - 增 删 改 查 ORM利用pymysql第三方工具链接数据库 Django默认的是sqlite数据库 将Django数据库修改为mysql: 1.settings.py 配置 DATABASES = {

django 学习个人总结 之form提交放到数据库中

project:test04 app:blog models.py from django.db import models class User(models.Model): username = models.CharField(max_length=20) headImg = models.FileField(upload_to='./upload/') views.py from django.shortcuts import render_to_response from django

Django-website 程序案例系列-4 ORM数据库操作

数据库表的创建: 使用mysql时注意,在setting.py中的设置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #mysql的引擎 'NAME': '', #数据库名 'USER': '', #数据库用户名 'PASSWORD': '', #数据库密码 'HOST': '127.0.0.1', #数据库host 'PORT': '3306', #数据库端口 },} 还需在项目文件夹下的__init__.p

android菜鸟学习笔记20----Android数据存储(四))Android数据库操作

Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便.SQLite与别的数据库不同的是,它没有数据类型.可以保存任何类型的数据到你所想要保存的任何表的任何列中.但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB...等. 唯一的例外是:integer primary key 此字段只能存储64位整数. 在JAVA项目中,要使用JDBC操作数据库需要加载数据库驱动,连接数据库等操作.Android简化

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数