Django中ORM外键和表的关系(Django编程-4)
2019-05-18 18:01
1731 查看
外键
在
MySQL中,表有两种引擎,一种是
InnoDB,另外一种是
myisam。如果使用的是
InnoDB引擎,是支持外键约束的。外键的存在使得
ORM框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在
Django中的使用。
类定义为
class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有
CASCADE、
SET_NULL等。这里以一个实际案例来说明。比如有一个
User和一个
Article两个模型。一个
User可以发表多篇文章,一个
Article只能有一个
Author,并且通过外键进行引用。那么相关的示例代码如下:
class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey("User",on_delete=models.CASCADE)
以上使用
ForeignKey来定义模型之间的关系。即在
article的实例中可以通过
author属性来操作对应的
User模型。这样使用起来非常的方便。示例代码如下:
article = Article(title='abc',content='123') author = User(username='张三',password='111111') article.author = author article.save() # 修改article.author上的值 article.author.username = '李四' article.save()
为什么使用了
ForeignKey后,就能通过
author访问到对应的
user对象呢。因此在底层,
Django为
Article表添加了一个
属性名_id的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过
article.author访问的时候,实际上是先通过
author_id找到对应的数据,然后再提取
User表中的这条数据,形成一个模型。
如果想要引用另外一个
app的模型,那么应该在传递
to参数的时候,使用
app.model_name进行指定。以上例为例,如果
User和
Article不是在同一个
app中,那么在引用的时候的示例代码如下:
# User模型在user这个app中 class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) # Article模型在article这个app中 class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey("user.User",on_delete=models.CASCADE)
如果模型的外键引用的是本身自己这个模型,那么
to参数可以为
'self',或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:
class Comment(models.Model): content = models.TextField() origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True) # 或者 # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)
外键删除操作:
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过
on_delete来指定。可以指定的类型如下:
CASCADE
:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。PROTECT
:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。SET_NULL
:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。SET_DEFAULT
:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。SET()
:如果外键的那条数据被删除了。那么将会获取SET
函数中的值来作为这个外键的值。SET
函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。DO_NOTHING
:不采取任何行为。一切全看数据库级别的约束。
相关文章推荐
- Django - ORM 多对多关系 - 中间关系表的创建方式探讨
- django数据库操作-增删改查-多对多关系以及一对多(外键)关系
- Django - ORM的继承关系
- Python Django ORM 字段类型、参数、外键操作
- DjangoRestFramework的外键反向关系序列化的一个问题
- 56_Django数据库_ORM外键删除操作详解
- Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]
- 13)django-ORM(连表一对多,外键创建,创建数据,3种查询)
- [Django]orm中的外键级联删除
- Django的ORM数据模型的反向关系
- 深入Django ORM的继承关系
- Django中关于ORM 外键操作及初识Ajax
- django-orm字段、自定义字段、字段参数、元信息、多表关系
- django数据库操作-增删改查-多对多关系以及一对多(外键)关系
- Django外键关系描述
- 深入Django ORM的继承关系
- Django 的 models 里的外键之一对一,一对多,多对一,多对多关系
- django数据库操作-增删改查-多对多关系以及一对多(外键)关系
- django之ORM对象关系映射
- Django 的 model 处理,它是一种 ORM (Object Relation Mapping, 对象与关系的映射)