django-5-使用数据库

Posted hardykay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于django-5-使用数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Toad for Oracle 中使用自定义代码片段?

django-5-使用数据库

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

python---补充django中文报错,Django3.5出错

使用片段从数据库 SQLite 获取数据时出错

如何在 django 1.5 中自定义用户模型