Django-model-2

在上一篇博客中,我们做了一个单表的小项目,在本篇中,我们将延续前面的项目设定一对多表关系的完善。

表于表关系

  1、确定是什么关系

    如果是一对多关系,关联字段需要放到多的一方

     多的一方需要创建关联字段的外键约束:foreign key dep_id reference  dep(id)

    如果是多对多关系,需要创建第三张关系表

    create table student_teacher(

        id int primary key,

        student_id int,

        teacher_id int,

        foreign key student_id reference student(id)

        foreign key teacher_id reference teacher(id)

        )

    如果是一对一关系,

      foreign key 对应关系的字段可以在两个表中任何一个。关联字段是唯一的。

首先我们新建一个django的项目并创建app01应用,

在models.py中设置表关系

from django.db import models

# Create your tests here.
class Book(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    pubDate=models.DateField()
    price=models.DecimalField(max_digits=6,decimal_places=2)
    #django会自动给外键字段添加"_id",关联哪个表的字段就写哪个表名,django会自动关联publish表的主键
    publisher=models.ForeignKey("Publish")


#django如果表没有创建主键,会默认创建一个主键,名字叫id
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
    tel = models.BigIntegerField()

一、需要注意的几个点:

      1、没有设置主键的表,django会自动创建,并取名为id

      2、创建外键语法  [字段名]=models.ForeignKey("关联表名") 没错这里只需要写要关联的表名就可以自动关联

二、在terminal中执行 :

      1、python manage.py makemigrations 

                        2、python manage.py migrate

创建表成功!

 

可以看出我们在book类中,创建的publisher属性,在创建出来后表中显示的是publisher_id~~~

上面是publish表!!!

 之前的项目用的都是splite3库,下面介绍下使用mysql的方法!

 首先需要讲setting.py中的DATABSES配置

改为如下:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #你的数据库名称

        'USER': 'root',   #你的数据库用户名

        'PASSWORD': '', #你的数据库密码

        'HOST': '', #你的数据库主机,留空默认为localhost

        'PORT': '3306', #你的数据库端口

    }

}

 然后修改python中mysql的解释器引擎更改:

    MYsqlDB-->pymysql

在应用的__init__.py中,需要注意是应用的__init__.py中

 

回过头来,继续折腾我们的一对多表关系的项目。

首先我们在book表中和publish表中手动添加一些信息

我们将上个练习中

1、static目录复制到新建的项目中,并设置路径到环境变量中。

2、将index.html复制过来,

3、将views.py中的index函数复制过来,

4、将urls中添加指向index视图函数

而我们需要修改的地方只有index.html中的

没错我们只是将上个项目的index.html 中{{book_obj.publish}}改成{{book_obj.publisher.name}}

然后我们就可以访问了,关于为什么更改后可以正常访问,我们稍后再说。

 

---------------------------------我是分割线------------------------------------------

 开始进行添加功能!

 添加功能我们继续延续之前的联系进行修改,

1、add.html复制过来,由于现在的publish改为了publish_id,所以我们将publish表当作对象传给模板中add.html进行渲染

将出版社作为下拉菜单进行显示,并通过pub变量进行值的回传

可以看到

 

当我们点击提交时,触发post方式,进行记录的创建。

 添加成功!

 

创建语句详解
#这行代码会有一个返回值,返回值就是要插入的这条记录对象
models.Book.objects.create(title=title,pubDate=pubDate,price=price,publisher_id=publisher_id)

#还可以写成:
book_obj=models.Book(title=title,pubDate=pubDate,publisher_id=publisher_id)
book_obj.price=price
book_obj.save()
#根据需求,当获取的是一个对象时,创建表用这种方式,当获取的直接是关联字段id时,使用上面那种,从orm层publisher是book表中的对象,值为publish表中对应记录的对象
publish_obj=models.Publish.objects.filter(name="北京出版社")[0]
models.Book.objects.create(title=title,pubDate=pubDate,price=price,publisher=publish_obj)
 

 ---------------------------------------------------------我是分割线---------------------------------------------

删除功能

index.html中删除按钮的位置

 根据传给后端的nid,对表记录进行删除,然后重定向到index.html

在index页面,点击删除,成功!

----------------------------------我是分割线---------------------------------------

添加个编辑功能

当点击编辑时,触发get请求,并根据url中的信息,获取要编辑记录的nid,我们需要将对应id的记录,和出版社对象传给edit.html进行渲染

 其中出版社对象,用作下拉菜单,book对象用作默认值

可以看到点击编辑时

修改完成后,点击提交时,触发post请求。

获取request对象中各个值,进行update记录。

 ---------------------------------------------我是分割线----------------------------------------------------

添加一个搜索功能,我们在首页的html中,添加form表单,当text中输入值后,进行search路径的访问

 视图函数中添加下面代码,

1、先获取用户输入的字段

2、模糊查询

3、返回index.html和查询结果对象

 

查看结果!棒棒哒^_^

原文地址:https://www.cnblogs.com/kunixiwa/p/7834960.html