1. 程式人生 > >Django中數據庫中數據的添加方法

Django中數據庫中數據的添加方法

title titles ons .com int eat 書籍 get 中間

一對多的添加操作


首先我們需要弄明白的是兩張表中哪張表是對應的‘多’的那張表,哪張表對應的是‘一’的那張表。 如下:我們先建立一個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‘)

  

Django中數據庫中數據的添加方法