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')

  

转载于:https://www.cnblogs.com/wangmengzhu/p/8378268.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值