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‘)
Django中數據庫中數據的添加方法