Django的models介绍详解编程语言

我们一般会在创建表的类中写一个__str__方法,就会为为了打印这个对象不会打印一大堆的对象的内存地址,而是我们想要他返回的信息,方便我们更直观的知道这个对象是谁,方便显示。比如下面的例子

from django.db import models 
 
# Create your models here. 
class userInfo(models.Model): 
    # userInfo其实就是数据中表的内容 
 
    username = models.CharField(max_length=64) 
    age = models.CharField(max_length=64) 
    sex = models.CharField(max_length=64) 
 
    def __str__(self): 
        return self.username 

  

 下面我们正式进入models的学习

一、学习字段。通过models来调用各种字段

  

class userInfo(models.Model): 
    # userInfo其实就是数据中表的内容 
 
    username = models.CharField(max_length=64) 
    # CharField:存放较短的字符串的 
    price = models.IntegerField(null=True) 
    # IntegerField:存放数字的 
    age = models.CharField(max_length=64) 
    sex = models.CharField(max_length=64) 
    add = models.TextField(max_length=128) 
    # TextField:存放较长数字的 
    def __str__(self): 
        return self.username 

  

首先在project的settings中标明为哪个app创建表

Django的models介绍详解编程语言

 然后后执行命令

 python manager.py makemigrations  生成配置文件

python manager.py migrate 根据配置文件生成表

E:/python/django_project_test1>python manage.py makemigrations 
Migrations for 'test1_app1': 
  test1_app1/migrations/0001_initial.py 
    - Create model person 
 
E:/python/django_project_test1>python manage.py migrate 
Operations to perform: 
  Apply all migrations: admin, auth, contenttypes, sessions, test1_app1 
Running migrations: 
  Applying contenttypes.0001_initial... OK 
  Applying auth.0001_initial... OK 
  Applying admin.0001_initial... OK 
  Applying admin.0002_logentry_remove_auto_add... OK 
  Applying contenttypes.0002_remove_content_type_name... OK 
  Applying auth.0002_alter_permission_name_max_length... OK 
  Applying auth.0003_alter_user_email_max_length... OK 
  Applying auth.0004_alter_user_username_opts... OK 
  Applying auth.0005_alter_user_last_login_null... OK 
  Applying auth.0006_require_contenttypes_0002... OK 
  Applying auth.0007_alter_validators_add_error_messages... OK 
  Applying auth.0008_alter_user_username_max_length... OK 
  Applying sessions.0001_initial... OK 
  Applying test1_app1.0001_initial... OK 
 
E:/python/django_project_test1> 

  

单表的操作

1、插入数据,然后在视图函数中为表插入信息,可以使用create和save的方式,但是我们这里只掌握create方式吧

下面是通过字段的方式插入数据

        models.userInfo.objects.create( 
            username = username_new, 
            age = age_new, 
            sex = sex_new 
        ) 

  

我们还可以通过两个*号加字典的方式传递,主要是使用第二种方法,因为我们从前端一般拿到的数据就是一个字典

        test_dic= {"usernmae":username_new,"age":age_new,"sex":sex_new} 
        models.userInfo.objects.create(**test_dic) 

  

 2、删除数据,通过filter方法找到数据,然后调用delete方法删除数据即可

 models.userInfo.objects.filter(id=1).delete() 

  

3、修改数据,通过update和save两种方法可以获取

先介绍下save方法,先通过get获取到数据库中的数据,然后修改数据,然后调用save方法保存数据,通过get方法拿到的对象是一个单个对象

        auther = models.userInfo.objects.get(id=5) 
        auther.name = "xxxx" 
        auther.save() 

  

在来看下update方法,先通过filter找到要修改的数据,然后通过update方法更改数据,这里要说明,这里必须filter,filter拿到的一个对象集合,且upate的方法必须对一个对象集合做操作,而不能使用get方法,这里说的集合就是个列表

models.userInfo.objects.filter(id=5).update(name="xxxxx") 

  

 4、在来看下查

先来介绍下filter方法,通过过滤多个字段属性的来查询数据,查询符合条件的结果,拿到的结果对象是一个list

models.userInfo.objects.filter(**{"username":"alex","age":23}) 

 

models.userInfo.objects.filter(**{"username":"alex","age":23}).values("name") 

  

在来看下all方法,查询所有的结果,all里面有参数,难道的结果对象是一个list

user_list = models.userInfo.objects.all() 

  

在来看下exclude方法,这个对取反,取出哪些不符合这些这条件的数据

models.userInfo.objects.exclude(**{"username":"alex","age":23}) 

  

在看来下distinct,对拿到的数据进行去重

models.userInfo.objects.distinct(**kwargs) 

  

count方法:获取查询到对象的数量

first方法:返回第一条记录

last方法:放回最后一条记录

exists():判断是否存在某个数据

order_by():排序

多表的操作之一对多

一、先来看下如果创建一对多,比如我们下面的例子,我们创建一个person表,这个表中有一个字段叫school,那么一个人只能对应一个学校,而一个学校可以对应多个人,那么

这个一就是学校,多就是人,我们在创建表的时候,需要在多的表里创建外键关系,比如下面的例子这一句就是外键关系,实现一对多的效果

 school = models.ForeignKey("school")


class userInfo(models.Model): 
    # userInfo其实就是数据中表的内容 
 
    username = models.CharField(max_length=64) 
    # CharField:存放较短的字符串的 
    price = models.IntegerField(null=True) 
    # IntegerField:存放数字的 
    age = models.CharField(max_length=64) 
    sex = models.CharField(max_length=64) 
    add = models.TextField(max_length=128) 
    school = models.ForeignKey("school") 
    # TextField:存放较长数字的 
    def __str__(self): 
        return self.username 

  

那么如果是一个一对多的表,我们如何插入一个数据呢?我们这里有虽然school这列对应的值是school-id,所有我们在插入数据的时候直接school_id = 2就可以了

或者我们也可以通过filter方式查询到指定的school表的某一个行,然后让school = school[0]来设置值

下面我们看下一个例子

首先在models文件中创建两张表,其中user_info表中的user_sch和school表是外键关系,一个学生只能对应一个学校,一个学校中可以有多个学生,所以学生属于多,在ForeignKEey写在user_info表中,对关联school表

from django.db import models 
 
# Create your models here. 
 
class user_info(models.Model): 
    user_name = models.CharField(max_length=64) 
    user_pwd = models.CharField(max_length=64) 
    user_age = models.IntegerField(max_length=32) 
    user_sex = models.CharField(max_length=32) 
    # user_sch = models.CharField(max_length=44) 
    user_sch = models.ForeignKey("school") 
    def __str__(self): 
        return self.user_name 
 
 
class school(models.Model): 
    school_name = models.TextField(max_length=128) 
    school_address = models.TextField(max_length=128) 
    school_level = models.CharField(max_length=32) 
    def __str__(self): 
        return self.school_name 

  

我们在看下我们的前端的页面

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>注册用户</title> 
    <style> 
        h3{ 
            color: red; 
            font-weight: bold; 
        } 
    </style> 
</head> 
<body> 
    <form action="/app1/test1/" method="post"> 
        <h3>基本用户信息</h3> 
        用户:<input type="text" name="user_name"> 
        <br/> 
        密码:<input type="password" name="user_passwd"> 
        <br/> 
        年龄:<input type="text" name="user_age"> 
        <br/> 
        学校:<input type="text" name="user_school"> 
        <h3>性别</h3> 
        男:<input type="radio" name="sex" value="man"> 
        女:<input type="radio" name="sex" value="wom"> 
{#        <br/>#} 
        <h3>-------------------------------------------------------------------------</h3> 
        <input type="submit" value="提交"> 
    </form> 
    <h3>-------------------------------------------------------------------------</h3> 
    <h3>信息展示</h3> 
    <table border="1"> 
        <caption>展示用户信息</caption> 
        <thead> 
            <tr> 
                <th>姓名</th> 
                <th>密码</th> 
                <th>性别</th> 
                <th>年龄</th> 
                <th>学校</th> 
            </tr> 
        </thead> 
        <tbody> 
            {% for i in user_list %} 
                <tr> 
                    <td>{{ i.user_name }}</td> 
                    <td>{{ i.user_pwd }}</td> 
                    <td>{{ i.user_sex  }}</td> 
                    <td>{{ i.user_age }}</td> 
                    <td>{{ i.user_sch }}</td> 
                </tr> 
            {% endfor %} 
 
        </tbody> 
    </table> 
 
</body> 
</html> 

  

我们重点看下如何插入ForieginKey这一列的数据

from django.shortcuts import render 
from django_models_app1 import models 
from django.shortcuts import HttpResponse 
# Create your views here. 
def test1(request): 
    # print(request.method) 
    if request.method.lower() == "post": 
        input_name = request.POST.get("user_name") 
        input_pwd = request.POST.get("user_passwd") 
        input_sex = request.POST.get("sex") 
        input_age = request.POST.get("user_age") 
        input_sch = request.POST.get("user_school") 
        print(input_sch,"-----------------------------") 
        school_id = models.school.objects.filter(id=1) 
        print(school_id[0].id) 
        print("school_id",school_id,sep="-------------------------------------------") 
        models.user_info.objects.create( 
            user_name = input_name, 
            user_pwd = input_pwd, 
            user_age = input_age, 
            user_sex = input_sex, 
            user_sch = school_id[0] 
        ) 
 
        user_list = models.user_info.objects.all() 
 
        return render(request, "register.html",{"user_list":user_list}) 
    else: 
        # models.user_info.objects.filter(id=7).update(user_name="崔熙雯") 
        # models.user_info.objects.filter(id=8).delete() 
        models.user_info.objects.all().delete() 
        return render(request,"register.html") 
 
def school(request): 
    if request.method.lower() == "post": 
        school_name = request.POST.get("school_name") 
        school_address = request.POST.get("school_address") 
        school_level = request.POST.get("school_level") 
        print(school_name) 
        models.school.objects.create( 
            school_name = school_name, 
            school_address = school_address, 
            school_level = school_level 
        ) 
        return render(request, "school.html") 
    else: 
        return render(request,"school.html") 

  

Django的models介绍详解编程语言

 我们不仅仅可以通过id查找外键关系,还可以使用其他字段,下面的例子就是用name来查找外键关系

        school_id = models.school.objects.filter(school_name=input_sch) 
        print(school_id[0].id) 
        print("school_id",school_id,sep="-------------------------------------------") 
        models.user_info.objects.create( 
            user_name = input_name, 
            user_pwd = input_pwd, 
            user_age = input_age, 
            user_sex = input_sex, 
            user_sch = school_id[0] 
        ) 

  

我们在前端输入指定的学校的名称,他会通过学校的名称来自动关联学校的id

Django的models介绍详解编程语言

多表的操作之多对多,在任意一张表创建均可以,比如一个作者可以写多本书,而一本书也可能有多个作者,所以这里是多对多的关系,django会自动为什么创建第三表,保存book_id和publish_id的映射关系

language = models.ManyToManyField("Country") 

  

先通过filter获取两个作者的对象,然后在书的表中为auther这个属性添加获取到的两个作者的对象即可

book.auther.add(auther1,auther2) 

  

多对多的操作,第三种表是django自动创建的,比如我们的例子,一个user_info表和course表,user_info和course中的字段不存在任何这2张表中,他存在于第三张表

绑定关系用add方法

取消绑定用remove方法

Django的models介绍详解编程语言

多对多还是比较复杂的,我们在从头开始捋一捋

1、多对多只需要在一张表中设置就可以了,不需要在两张表设置。我们的例子是这样的,用户表和课程表,这2张表是多对多关系的,我们先来看两种的字段

用户表,我们在用户表有关联到课程表,且用ManyToManyField来关联

Django的models介绍详解编程语言

 我们在来看下课程表,课程表中仅仅只有一个字段,就是课程的名称,和用户没有任何关系

Django的models介绍详解编程语言

 2、表的类创建成功后,我们就执行命令初始化表

python manage.py makemigrations

python manage.py migrate

 我们来看下数据库中的表的内容,先看用户表,他的表中也和课程表没有任何关系

Django的models介绍详解编程语言

 我们在看下课程表,课程表和用户没有任何关系

Django的models介绍详解编程语言

 那么用户和课程该怎么关联起来呢?这个时候就需要用到第三表,第三表是由Django自动为我们创建的

那么我们就来看下第三表。我们看到在第三表中,关联了用户和课程的信息

Django的models介绍详解编程语言

2、表已经创建成功了,下面我们来看下如何插入数据,插入数据也是用add方法

首先我们看下用户表插入数据的代码,分为两部分,第一部分是下面的内容,但是不包括多对多的项,因为我们在上面也看到,在用户表中压根就没有课程这一列

Django的models介绍详解编程语言

然后我们在看客户插入数据的代码,同样,也仅仅插入自己的信息,但是不包括多对多的项,因为我们在上面也看到,在课程表中压根中没有用户这一列

Django的models介绍详解编程语言

  最后我们在往第三表中插入数据,第三表是django默认创建的,所以我们不需要通过表明去插入数据,我们在用户表的视图函数为第三表中插入数据

Django的models介绍详解编程语言

 我们需要解释一下上面的代码

第一句:先找到用户表中, 未哪个用户添加课程信息,也就是用户对象

第二句:然后找到课程,也就是我们要为第一句的用户添加的课程的表对象

第三句:是错误的示范,我们不是为某张表添加课程,而是为某个用户添加课程对象

第四句:这个正确的示范,我们为某个用户添加课程数据,使用add方法

下面我们实际看下数据库中表的内容

先看用户表的信息,主要关注id的信息,周雍博的id为8

Django的models介绍详解编程语言

在来看下课程表,主要关注课程表的id信息,我们为周雍博这个用户添加的课程为大学体育,id为4

 Django的models介绍详解编程语言

最后我们要看第三张表的内容

Django的models介绍详解编程语言

 同样,如果删除,只需要把add替换为remove即可

多对多的第二种方法,上面的方法是django为我们创建表,我们还可以自己创建第三张表,作者这列一对多作者表,书这一列一对多书表,红色圈中的意思是联合唯一的意思

Django的models介绍详解编程语言

这个时候在往第三张表插入数据就需要我们自己做了,那么这个时候该如何插入呢?其实就用我们的前面讲的create方法来插入数据就可以了

Django的models介绍详解编程语言

 这个时候就不需要在第一张表写ManyToManyField了

如果要删除数据的话,不仅仅book中的数据会被删除,book2auther表中的数据也会被删除

更改数据的方法也和之间一对多的场景的方法一样

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20833.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论