django manytomany 保存和更新

2018/7/27 posted in  python

Django中的模型类维护了一对多和多对多的关系。在保存这些关联对象时,只要按照属性字段为其设置相对应的管理对象,然后调用save()方法即可。比如下面代码中,一个Blog对应多个Entry对象;多个Entry对应多个Auther对象:

class Blog(models.Model):
name=models.CharField(max_length=100)
tagline=models.TextField()
def unicode(self):
return self.name
class Author(models.Model):
name=models.CharField(max_length=50)
email=models.EmailField()
def unicode(self):
return self.name

class Entry(models.Model):
blog=models.ForeignKey(Blog)
headline=models.CharField(max_length=255)
body_text=models.TextField()
pub_date=models.DateTimeField()
mod_date=models.DateTimeField()
authors=models.ManyToManyField(Author)
n_comments=models.IntegerField()
n_pingbacks=models.IntegerField()
rating=models.IntegerField()

def __unicode__(self):
    return self.headline

现在我们开始保存Entry对象,先来看如何保存一对多关联对象:

$ python manage.py shell
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type “help”, “copyright”, “credits” or “license” for more information.
(InteractiveConsole)

from myapp.models import *
import datetime
e1=Entry(headline=‘Hello’,body_text='Hello World’,pub_date=datetime.datetime
.now(),mod_date=datetime.datetime.now(),n_comments=1,n_pingbacks=1,rating=1) # 创建一个Entry对象
b=Blog.objects.get(pk=1) # 取得一个已经存在的Blog对象
e1.blog=b #设置这个Entry属于取得的Blog
e1.save() # 保存这个Entry对象
由于Blog和Entry之间是一对多关系,所以这里我们保存这个Entry的Blog属性时,只要将它的blog字段赋值即可。
下面再来看看如何保存多对多关系:

eric=Author.objects.create(name='Eric’,email='test@test.cn’) # 用create方法创建一个Author对象
e1.authors.add(eric) #把这个Author加入到Entry中
e1.save() #保存这个Entry对象
保存多对多关系时,需要通过create方法创建一个多对多管理的对象,这里是Author。由于一个Entry有多个Author,所以我们这里用到了add()方法,来把这个Author添加到Entry中。我们在使用create()、get()方法时都是使用了相应对象的objects这个对象。这里的objects是对象的管理器,它是Django为每个模型对象提供的默认管理器对象,需要注意的是,objects对象只能是类级别的对象,而不是实力级别的对象。也就是说如果你构造了一个模型对象的实例,是不能通过实例来获取objects的,如果这样使用会抛出异常。