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
  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/hardykay/p/9956991.html
Copyright © 2011-2022 走看看