zoukankan      html  css  js  c++  java
  • Django之模型的创建

    web应用中,经常涉及到和数据库的的交互,比如我们在京东上买一个东西,查询的时候网站会自动转到后端数据库去查询,然后呈现在网页上

    Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

    M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

    T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

    V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

     对于数据库,我们可以用Mysql进行存储,如下面的代码:

    def book_list(request):
        db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
        cursor = db.cursor()
        cursor.execute('SELECT name FROM books ORDER BY name')
        names = [row[0] for row in cursor.fetchall()]
        db.close()
        return render('book_list.html', {'names': names})


    但是每次进行存储和取数据的时候都得进行数据库连接,不是很方便。好在Django内置了继承了sqlite数据库。我们可以直接使用。在setting.py文件中有如下的默认定义,可以看到引擎使用的是sqlite3,路径在工程路径下,名字是db.sqlite3

    在工程界面下,可以看到db.sqlite3文件

    Django采用模型在后台执行SQL代码并把结果用python的数据结果来描述。这样的好处是你在写处理函数的时候,只需要考虑python代码,不用再Python和SQL代码之间来回切换。另外由于django可以配置不同的数据库,不同的数据库平台存在兼容性问题,因此使用python描述数据结构可以适用不同的平台
    下面我们就来建立自己的模型:
    首先在models.py中定义如下数据模型:定义了3个模型,一个是出版商,一个是作者,一个是书籍。从定义中可以看出,每个类型包含不同的属性。且每个属性有不同的类型,比如是字符类的,时间类的。和数据库语言差不多是类似的
    比如SQL中建立一个表CREATE TABLE Publisher(name char(30),address char(30))。所以每个模型就可以认为是一个表

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()

    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()

    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
    这里解释下ForeignKey和ManyToManyFiled的用法。由于python的模型中封装了数据库的很多表示法,所以django定义了很多参数来表达数据库之间的联系
    ForeignKey:一对多的关系。对于一个出版商来说,不可能只出版一本书,因此设置publisher = models.ForeignKey(Publisher)就将每本书和出版商关联了起来。因此ForeignKey的一对多可以理解为一个出版商对应对本书
     
    ManyToManyField:多对多的关系。在一本书里,也许作者并不至一个。有多个作者。那么对于Book来说,定义了authors可以查到这本书所有的作者。而对于Authors这个模型来说,也可以通过这个关联反查到这个作者的所有书籍
    另外每个模型都是models.Model的子类,它的父类Model包含了所有和数据库进行交互的方法。
    pycharm的终端上执行python manage.py makemigrations App名字,可以看到系统开始创建数据表
    D:django_test2>python manage.py makemigrations site_prj
    Migrations for 'site_prj':
      site_prjmigrations001_initial.py:
        - Create model Author
        - Create model Book
        - Create model Publisher
        - Add field publisher to book
    此时才生成initial.py文件

    class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
    migrations.CreateModel(
    name='Author',
    fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    ('first_name', models.CharField(max_length=30)),
    ('last_name', models.CharField(max_length=30)),
    ('email', models.EmailField(max_length=254)),
    ],
    ),
    migrations.CreateModel(
    name='Book',
    fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    ('title', models.CharField(max_length=50)),
    ('publish_date', models.DateField()),
    ('authors', models.ManyToManyField(to='site_prj.Author')),
    ],
    ),
    migrations.CreateModel(
    name='Publisher',
    fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    ('name', models.CharField(max_length=30)),
    ('address', models.CharField(max_length=50)),
    ('city', models.CharField(max_length=20)),
    ('state_province', models.CharField(max_length=20)),
    ('country', models.CharField(max_length=30)),
    ('website', models.URLField()),
    ],
    ),
    migrations.AddField(
    model_name='book',
    name='publisher',
    field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='site_prj.Publisher'),
    ),
    ]
    当定义了类型后,后面有需求有添加该如何处理呢。比如我们在出版商Publisher这个模型下面添加一个字段成立日期:
    setup_date=models.DateField()
    此时添加后,需要同步。在终端上执行python manage.py makemigrationsz首先进行迁移:出现如下提示。意思是这个变量没有一个默认值,选择1表示自行添加一个默认值

    此时会进行python界面,输入值后退出。我选择的是timezone.now表示当前时间

    再执行python manage.py migrate 进行迁移。如下所示,表示更新成功

    本节介绍了模型的创建方法,后面将会介绍模型数据的获取方法以及和网页前端的交互

    
    
    
    
    
    
    
     
    
    
    
    
    
  • 相关阅读:
    【leetcode_easy_array】1010. Pairs of Songs With Total Durations Divisible by 60
    【leetcode_easy_array】1013. Partition Array Into Three Parts With Equal Sum
    【leetcode_easy_array】1122. Relative Sort Array
    【opencv基础】opencv中cv::Mat和eigen数据之间的转换
    【c++基础】测试SocketCAN的收发功能
    SRM系统与ERP系统之间存在什么联系(转)
    使用IDEA搭建一个简单的SpringBoot项目——详细过程(转)
    SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)
    IntelliJ IDEA创建maven web项目(IDEA新手适用)(转)
    Maven的安装与配置(转)
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7786863.html
Copyright © 2011-2022 走看看