Django中数据库中数据的添加方法
Posted Dreamkily
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中数据库中数据的添加方法相关的知识,希望对你有一定的参考价值。
一对多的添加操作
class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) pubDate=models.DateField() price=models.DecimalField(max_digits=6,decimal_places=2) publisher=models.ForeignKey(to="Publish")
再建立一个Publish表,也即是出版社表:
class Publish(models.Model): name=models.CharField(max_length=32) addr=models.CharField(max_length=32) tel=models.BigIntegerField()
从上面两张表中我们可以看出,书对应的‘多’的哪一方,出版社对应的是‘一’的那一方。讲两张表关联起来,可以运用代码publisher=models.ForeignKey(to="Publish"),此时在book表中会出现字段publisher_id字段,其中_id为pycharm默认补充的。
现在来写如何向一对多表中添加数据,如下:
def add(request): if request.method=="POST": titles = request.POST.get("title") pubdate = request.POST.get("pubdate") price = request.POST.get("price") publish_id = request.POST.get("pub") # 一对多 添加数据 方式1 # publish_obj=models.Publish.objects.get(name="renmin") # book_obj=models.Book.objects.create(title="python",price=122,pubDate="2012-12-12",publisher=publish_obj) # 一对多 添加数据 方式2 book_obj=models.Book.objects.create(title=titles,price=price,pubDate=pubdate,publisher_id=publish_id) print(book_obj.title) # obj=models.Book(title="python",price=122,pubDate="2012-12-12",publisher=publish_obj) # obj.save() return redirect("/index/")
多对多的添加操作
class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() tel=models.CharField(max_length=32) def __str__(self): self.name+\' \'+str(self.age)
在建好了第三张表之后,我们需要在Book表中添加关联字段如下:
class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) pubDate=models.DateField() price=models.DecimalField(max_digits=6,decimal_places=2) publisher=models.ForeignKey(to="Publish") #书籍与作者:多对多 authors=models.ManyToManyField(\'Author\')
此时在sqlite中将会出现第三张虚拟表,其中虚拟表中存放的是author_id和book_id,这即是所需要的多对多的关系,通常情况下,不可以手动添加,往第三张表中添加关联关系的数据代码如下:
book_obj=models.Book.objects.create(title=titles,price=price,pubDate=pubdate,publisher_id=publish_id) print(book_obj.authors.all()) alex=models.Author.objects.get(name=\'alex\') egon=models.Author.objects.get(name=\'egon\') book_obj.authors.add(alex,egon)
此时我们可以将egon和alex添加到数据库新建立的关系字段中,在虚拟表authors_book表中,我们可以看到生成了如下结果:
至此,多对多的数据添加操作完成。
基于对象的正向查询和反向查询
def query(request): #一对多的正向查询 # book_obj=models.Book.objects.get(title=\'python\') # author_list=book_obj.authors.all() # for author_obj in author_list: # print(author_obj.age)
正向查询时,我们需要查询的是一本书对应的所有作者信息,此时我们首先需要从Book表中获得python那本书的书籍对象,之后利用这本书籍对象获得所有的作者列表,循环作者列表,查询所需要的信息。
反向查询:
def query(request): pub_obj=models.Publish.objects.get(name=\'机械出版社\') book_list=pub_obj.book_set.all() for obj in book_list: print(obj.title)
在反向查询时,我们的目的是要获得机械出版社出版的所有图书信息,首先我们需要获得出版社对象,之后利用出版社对象获得图书的列表,在这里注意的是在获取图书列表时我们需要取得对象是book_set而不是book对象,最后再循环书籍对象,即可以获得我们所需要的信息。
多对多反向查询
def query(request): alex=models.Author.objects.get(name=\'alex\') book_list=alex.book_set.all() for obj in book_list: print(obj.title,obj.price)
这里用的多对多的对象是书籍和作者,首先需要从Author表中获得作者对象,之后利用作者对象从book_set中取出所有的书籍列表,遍历书籍列表中的每一本图书,打印出所需要的图书信息。
一对一查询
def query(request): #一对一的查询:正向查询,按照字段 # autor_detail=models.AuthorDetail.objects.get(addr=\'shahe\') # print(autor_detail.author.name) return HttpResponse(\'OK\')
我们首先建立两张一对一的关联表,在正向查询中,我们需要获得的是地址在shahe的作者,首先我们从AuthorDetail表中获得作者对象,之后利用作者对象从autor表中获得所需要的信息
反向查询:在反向查询的时候,查询的核心是按照表名来进行查询
def query(request): #一对一查询:反向查询,按照表名 alex=models.Author.objects.get(name=\'alex\') print(alex.authordetail.addr) return HttpResponse(\'OK\')
以上是关于Django中数据库中数据的添加方法的主要内容,如果未能解决你的问题,请参考以下文章