zoukankan      html  css  js  c++  java
  • django数据库模型

    学习模型之前需要明白何为project,何为app ?

      1.在django中project表示配置,eg. 数据库配置、视图模板、安装的app列表以及url和视图函数之间的映射等

      2.一个app是一套django功能的集合,通常包含视图和模型,以python包的形式展现;app可以方便的被移植、复用;一个project可以包含多个app,每个app负责不同的功能

    系统对app有一个约定:如果你使用了django的数据模型,你必须创建一个django app,模型必须放在apps中;

    1.在pyCharm中终端执行如下命令创建app

     python manage.py startapp books

    2. 在models.py中编写模型代码

    from django.db import models
    
    # Create your models here.
    
    
    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()
    
        def __unicode__(self):
            return self.name
    
        class Meta:
            ordering = ['name']
    
    
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()
    
        def __unicode__(self):
            return '%s %s' % (self.first_name, self.last_name)
    
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        author = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
    
        def __unicode__(self):
            return self.title

    备注: class Meta表示模型的元信息,eg. 缺省排序; __unicode__方法可以进行任何处理来返回一个对象的字符串表示,类似java中的toString()

    3. 校验模型的合法性--语法和逻辑是否正确

    python manage.py validate

    4. 打印出sql(可以查看django模型与建表sql的对应关系)

    python manage.py sqlall books

    此时数据库并没有创建任何表

    5. 创建表

    python manage.py syncdb

    6. 登录数据库命令行客户端

    python manage.py dbshell  (django根据配置文件中配置的数据库信息,自动检测使用不同的命令行客户端)

    #########################################################################

    如何利用django提供的API进行CRUD操作呢?

    1. 创建对象

    p1 = Publisher(name="O'Reilly", address='10 Fawcett St.', city='Cambridge', state_province='MA', country='U.S.A.', website='http://www.oreilly.com/')
    p1.save()

    p2 = Publisher.objects.create(name="O'Reilly", address='10 Fawcett St.', city='Cambridge', state_province='MA', country='U.S.A.', website='http://www.oreilly.com/')

     2. 查询对象

    publisher_list = Publisher.objects.all()   #返回querySet,一个伪列表对象
    
    publisher_list = Publisher.objects.filter(name='Jerry') #此处精确匹配name
    
    publisher_list = Publisher.objects.filter(name__contains='Jerry') #此处模糊匹配name
    
    publisher_list = Publisher.objects.filter(name__contains='Jerry').order_by('name') #按字母表正向排序
    
    publisher_list = Publisher.objects.filter(name__contains='Jerry').order_by('-name') #按字母表逆向排序
    
    publisher = Publisher.objects.get(name='Jerry')  #返回单个对象,此方法会抛出异常,Publisher.DoesNotExist、MultipleObjectsReturned

    3. 更新对象

    p1 = Publisher(name="O'Reilly", address='10 Fawcett St.', city='Cambridge', state_province='MA', country='U.S.A.', website='http://www.oreilly.com/')
    p1.save()
    
    p1.name='update name'
    
    p1.save()   #此方法会更新所有字段,影响性能并且可能会引发竞态条件
    
    Publisher.objects.filter(id=52).update(name='Apress Publishing')  #此方法只更新指定字段,可以有多个参数

    4. 删除对象

    p = Publisher.objects.get(name="O'Reilly")
    p.delete()
    Publisher.objects.all()
    
    Publisher.objects.all().delete()  #谨慎使用
  • 相关阅读:
    apache设置无缓存
    唤醒键盘时取消对特定类的position:fixed定位
    vscode增加sftp扩展
    浮层蒙版加载中实现方式
    管理应用程序版本Elastic Beanstalk
    向 Elastic Beanstalk 环境中添加数据库
    在 Amazon ECS 上运行 X-Ray 守护程序
    SNS Message Attributes
    ProvisionedThroughputExceededException
    使用 Amazon CloudWatch Events 检测和响应管道状态更改
  • 原文地址:https://www.cnblogs.com/506740640zl/p/5929426.html
Copyright © 2011-2022 走看看