Python系列视频教程: Django【13讲】第11讲 数据库多对多映射

31 篇文章 0 订阅
23 篇文章 0 订阅

Python系列视频教程: Django【13讲】第11讲 数据库多对多映射

前面我们看了通过admin的界面,对数据库进行CRUD操作。

今天我们再来看看,如何在数据库里面进行多对多映射

 

这次我们创建csvt06和应用blog

修改settings.py

 

修改blog\models.py

 

from django.db import models

# Create your models here.
class Author(models.Model):
  name=models.CharField(max_length=30)
 
  def __unicode__(self):
   return self.name

class Book(models.Model):
  name=models.CharField(max_length=30)
  authors=models.ManyToManyField(Author)
 
  def __unicode__(self):
   return self.name
   

 

python manage.py syncdb
jian.zhang/~cajan
   
   进入到解释器环境

sqlite3 csvt06.sqlite3

可以看到三张blog的表已经有了


   python manage.py shell

D:\test\mysite\csvt06>python manage.py shell
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Author,Book
>>> Author.objects.create(name='Alen')
<Author: Alen>
>>> Author.objects.create(name='Ben')
<Author: Ben>
>>> Author.objects.create(name='Cool')
<Author: Cool>
>>> Author.objects.create(name='Dart')
<Author: Dart>
>>> authors=Author.objects.all()
>>> authors
[<Author: Alen>, <Author: Ben>, <Author: Cool>, <Author: Dart>]
>>> b1=Book()
>>> b1.name='python book1'
>>> b1
<Book: python book1>
>>> b1.save()
>>> author1=Author.objects.get(name='Alen')
>>> author1
<Author: Alen>
>>> b1.authors.add(author1)
>>> b1
<Book: python book1>
>>> b1.authors
<django.db.models.fields.related.ManyRelatedManager object at 0x019AE630>
>>> b1.authors(1)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'ManyRelatedManager' object is not callable
>>> b1.authors.all()
[<Author: Alen>]
>>> author2=Author.objects.get(name='Ben')
>>> b1.authors.add(author2)
>>> b1.authors.all()
[<Author: Alen>, <Author: Ben>]
>>> author3=Author.objects.get(name='Cool')
>>> b1.authors.add(author3)
>>> b1.authors.all()
[<Author: Alen>, <Author: Ben>, <Author: Cool>]
>>> b1.authors.remove(author1)
>>> b1.authors.all()
[<Author: Ben>, <Author: Cool>]
>>>

除了all()还可以使用filter(=)过滤

>>> b1.authors.filter(name__exact='Cool')
[<Author: Cool>]
>>>

使用get(=)获取

>>> b1.authors.get(name='Cool')
<Author: Cool>
>>>

我们还可以使用book_set

>>> author2.book_set
<django.db.models.fields.related.ManyRelatedManager object at 0x019B2E10>
>>> author2.book_set.all()
[<Book: python book1>]
>>>

>>> author1.book_set.all()
[]
>>> author1.book_set.add(b1)
>>> author1.book_set.all()
[<Book: python book1>]
>>>

>>> author1.book_set.create(name='python book2')
<Book: python book2>
>>> author1.book_set.all()
[<Book: python book1>, <Book: python book2>]
>>>

>>> books=Book.objects.all()
>>> books
[<Book: python book1>, <Book: python book2>]
>>>

>>> author1.book_set.remove(books[0])
>>> books
[<Book: python book1>, <Book: python book2>]
>>> author1.book_set.all()
[<Book: python book2>]
>>>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值