zoukankan      html  css  js  c++  java
  • django-5-使用数据库

    修改默认数据库

      django默认数据库为 SQLite3,若需要修改,比如改成mysql,则需要修改与settings.py文件同路径的__init__.py文件,添加如下内容:

      

    import pymysql
    pymysql.install_as_MySQLdb()
    

      

    ORM

      1、单表增删改查

        在models.py文件中创建数据库对象,然后同步数据库。

          

    from django.db import models
     
     
    class Person(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
    

        在views.py中导入models.py(from app.models import *),然后可以在函数或者方法中使用如下内容来调用数据库。

        增:

     1 增加数据有两种方式
     2 
     3 方式1
     4 
     5 b = Person(name=”姓名“,age=年龄)
     6 b.save()
     7 
     8 
     9 方式二
    10 
    11 Person.objects.create(name=”姓名“,age=年龄)

        改:

    方式1
    Person.objects.filter(name="姓名").update(age=新的年龄)  
    
    方式2
    
    p= Person.objects.get(name="姓名")
    
    p.age = 新的年龄
    
    p.save()
    
    
    请注意get只能取出一条,多了会报错。

      

       删:

    Person.objects.filter(name="姓名").delete()
    

       查询:

        都是通过objects来调用查询方法:如Person.objects.all()

        

     1 # 查询相关API:
     2 
     3 #  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
     4 
     5 #  <2>all():                 查询所有结果
     6 
     7 #  <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
     8 
     9 #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------
    10 
    11 #  <4>values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
    12                                      
    13 #  <5>exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
    14 
    15 #  <6>order_by(*field):      对查询结果排序
    16 
    17 #  <7>reverse():             对查询结果反向排序
    18 
    19 #  <8>distinct():            从返回结果中剔除重复纪录
    20 
    21 #  <9>values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    22 
    23 #  <10>count():              返回数据库中匹配查询(QuerySet)的对象数量。
    24 
    25 # <11>first():               返回第一条记录
    26 
    27 # <12>last():                返回最后一条记录
    28 
    29 #  <13>exists():             如果QuerySet包含数据,就返回True,否则返回False。

      2、一对多

          创建数据库:

          

     1 from django.db import models
     2 class Publisher(models.Model):
     3     name = models.CharField(max_length=30, verbose_name="名称")
     4     address = models.CharField("地址", max_length=50)
     5     city = models.CharField('城市',max_length=60)
     6     state_province = models.CharField(max_length=30)
     7     country = models.CharField(max_length=50)
     8     website = models.URLField()
     9  
    10  
    11     def __str__(self):
    12         return self.name
    13 
    14  
    15 class Book(models.Model):
    16     title = models.CharField(max_length=100)
    17     publisher = models.ForeignKey("Publisher")
    18     publication_date = models.DateField()
    19     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
    20 
    21     def __str__(self):
    22         return self.title

      publisher = models.ForeignKey("Publisher")就是建立外键关联。

        增:

     1 #一对多(ForeignKey):
     2 
     3     #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个
     4     #       字段设定对应值:
     5            Book.objects.create(title='php',
     6                                publisher_id=2,   #这里的2是指为该book对象绑定了Publisher表中id=2的行对象
     7                                publication_date='2017-7-7',
     8                                price=99)
     9 
    10 
    11     #方式二:
    12     #       <1> 先获取要绑定的Publisher对象:
    13         pub_obj=Publisher(name='河大出版社',address='保定',city='保定',
    14                 state_province='河北',country='China',website='http://www.hbu.com')
    15     OR  pub_obj=Publisher.objects.get(id=1)
    16 
    17 Book.objects.create(title='php',
    18                                 publisher=pub_obj,   #将 publisher_id=2 改为  publisher=pub_obj
    19                                publication_date='2017-7-7',
    20                                price=99)

        

      3、多对多  

          

     1 from django.db import models<br>
     2 class Publisher(models.Model):
     3     name = models.CharField(max_length=30, verbose_name="名称")
     4     address = models.CharField("地址", max_length=50)
     5     city = models.CharField('城市',max_length=60)
     6     state_province = models.CharField(max_length=30)
     7     country = models.CharField(max_length=50)
     8     website = models.URLField()
     9  
    10     class Meta:
    11         verbose_name = '出版商'
    12         verbose_name_plural = verbose_name
    13  
    14     def __str__(self):
    15         return self.name
    16  
    17 class Author(models.Model):
    18     name = models.CharField(max_length=30)
    19     def __str__(self):
    20         return self.name
    21  
    22 class AuthorDetail(models.Model):
    23     sex = models.BooleanField(max_length=1, choices=((0, ''),(1, ''),))
    24     email = models.EmailField()
    25     address = models.CharField(max_length=50)
    26     birthday = models.DateField()
    27     author = models.OneToOneField(Author)
    28  
    29 class Book(models.Model):
    30     title = models.CharField(max_length=100)
    31     authors = models.ManyToManyField(Author)
    32     publisher = models.ForeignKey(Publisher)
    33     publication_date = models.DateField()
    34     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
    35     def __str__(self):
    36         return self.title

        增:

        

    #多对多(ManyToManyField()):
    
        author1=Author.objects.get(id=1)
        author2=Author.objects.filter(name='alvin')[0]
        book=Book.objects.get(id=1)
        book.authors.add(author1,author2)
        #等同于:
        book.authors.add(*[author1,author2])
        book.authors.remove(*[author1,author2])
        #-------------------
        book=models.Book.objects.filter(id__gt=1)
        authors=models.Author.objects.filter(id=1)[0]
        authors.book_set.add(*book)
        authors.book_set.remove(*book)
        #-------------------
        book.authors.add(1)
        book.authors.remove(1)
        authors.book_set.add(1)
        authors.book_set.remove(1)
    
    #注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
    #     如果第三张表是自己创建的:
         class Book2Author(models.Model):
                author=models.ForeignKey("Author")
                Book=  models.ForeignKey("Book")
    #     那么就还有一种方式:
                author_obj=models.Author.objects.filter(id=2)[0]
                book_obj  =models.Book.objects.filter(id=3)[0]
    
                s=models.Book2Author.objects.create(author_id=1,Book_id=2)
                s.save()
                s=models.Book2Author(author=author_obj,Book_id=1)
                s.save()

         删:

    1 Book.objects.filter(id=1).delete()
    2 #我们表面上删除了一条信息,实际却删除了三条,因为我们删除的这本书在Book_authors表中有两条相关信息,这种删除方式就是django默认的级联删除。

            

     

    同步数据库 (将写好的数据表写入数据库)

      # Django 1.6.x 及以下

      python manage.py syncdb
     
      # Django 1.7 及以上的版本需要用以下命令
      python manage.py makemigrations
      python manage.py migrate
     
     
     
     
     
     
    参考:https://www.cnblogs.com/yuanchenqi/articles/6083427.htm
  • 相关阅读:
    rhel 6.4 + udev+ 11.2.0.3 + gi + asm+ rac 双节点安装
    rhel 6.4 + udev + 11.2.0.3 + asm 单点安装
    vmware 中linux虚拟机动态添加硬盘
    flashback drop
    flashback query
    11g crsctl start/stop crs 和 crsctl start/stop cluster 的关系
    10g crs 启动报错的记录
    检测数据库日志的切换频率及归档文件大小的sql
    用widthStep的方法来增加某范围的像素----与imageROI对比
    用imageROI来增加某范围的像素
  • 原文地址:https://www.cnblogs.com/hardykay/p/9956991.html
Copyright © 2011-2022 走看看