zoukankan      html  css  js  c++  java
  • Django中数据库中数据的添加方法

    一对多的添加操作


        首先我们需要弄明白的是两张表中哪张表是对应的‘多’的那张表,哪张表对应的是‘一’的那张表。
        如下:我们先建立一个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")

     再建立一个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/")
    

      

    多对多的添加操作


       有了一对一的添加操作之后,现在来学习多对多的添加操作,多对多的添加操作的核心是需要构建第三张中间表,将多对多的那两张表连接起来,具体操作如下:
     在上边操作的基础上,来构建第三章Author表:
    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表中,我们可以看到生成了如下结果:

     至此,多对多的数据添加操作完成。

    基于对象的正向查询和反向查询


        在Django中,查询可以分为正向查询和反向查询
        正向查询:
      
    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')
    

      

  • 相关阅读:
    react文本溢出hover气泡显示全部文本——JS判断文本溢出
    ecosystem.config
    git删除中间某次提交
    HTML5 新元素
    HTML5存储
    简述LVS(Linux虚拟服务器)
    简述线程池
    网络协议基础
    JVM常用性能检测工具
    线程间的“通信”方法
  • 原文地址:https://www.cnblogs.com/wangmengzhu/p/8378268.html
Copyright © 2011-2022 走看看