天天看点

django orm级联_Django系列文章:(一)使用ORM新增、更新和删除记录

(本系列文章参考资料为Django1.6官方的文档)

Django为我们提供了许多CRUD的封装,但是苦于IDE都没有提供很好的智能提示,所以用起来还真的是稍微有点不爽。

首先是模型的定义,这里就直接采用Django文档里面提供的模型做例子了(模型做了一点点的删减)

class Blog(models.Model):

name = models.CharField(max_length=100)

tagline = models.TextField()

class Author(models.Model):

name = models.CharField(max_length=50)

email = models.EmailField()

class Entry(models.Model):

blog = models.ForeignKey(Blog)

headline = models.CharField(max_length=255)

body_text = models.TextField()

pub_date = models.DateField()

mod_date = models.DateField()

authors = models.ManyToManyField(Author)

n_comments = models.IntegerField()

n_pingbacks = models.IntegerField()

rating = models.IntegerField()

创建记录

单表创建记录的方法倒是很简单,

b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')

b.save()

当然,想少写一行save的话,用Create方法就好了

b=Blog.objects.create(name='Beatles Blog')

用过Hibernate或者EntityFrame的话,这种新增的方式倒是挺熟悉的

同时插入主表和外键表的时候碰到一个有趣的问题,官方提供的插入示例是先把主表插进去,然后把主表的对象查询出来,然后再把外键表的信息插入进去。感觉这里为什么不同时把主外键表的信息一起插入进去呢?这样岂不是白白的浪费了一次查询。。。。

entry = Entry()

entry.save()

entry = Entry.objects.get(pk=1)

cheese_blog = Blog()

entry.blog = cheese_blog

entry.save()

稍微做了一些实验之后发现,可以采用如下的方法对主外键表进行同时更新,不用重新查询一般

a=Blog.objects.create()

b=Entry.objects.create(blog=a)

对多对多关系的表进行操作的方式也是比较特别,要先把主表的对象保存下来,然后把对象查出来,接着调用add的方法就可以了

joe = Author.objects.create(name="Joe")

entry.authors.add(joe)

同样的,也可以在创建的时候同时关联多表的对象

更新记录

更新记录的操作方式也和Hibernate差不多,把对象查出来,然后设置完相应的值之后save一下就好了,假如要更新的是外键的话,那么把外键的属性也赋值一下就OK。

b5.name = 'New name'

b5.save()

删除记录

把你希望删除的对象查询出来,然后调用delete()方法就可以了。比较特别的是,当删除了主表的信息,外键表的信息会被级联删除。而对于多对多关系的记录来说,关系表的记录会被级联删除掉。所以设计模型的时候记得要花点心思了