55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解

外键和表关系

外键是属于数据库级别的,在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常强大。因此这里我们首先来介绍外键在Django中的使用。

类定义为 class ForeignKey(to,on_delete,**options)。第一个参数to是应用的哪个模型(也就是应用的表),第二个参数on_delete在使用外键应用的模型数据被删除了,这个字段该如何处理。举例说明,如果有一个user和一个Article两个模型。一个user可以发表多篇文章,一个Article只能有一个Author,并且通过外键进行应用。

1. 使用外键引用同一个APP中的不同模型,示例代码如下:

# 注意:在定义一个模型的时候,模型的名字的首字母一定要大写,否者的话,模型名字下面会出现波浪线。
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模型。这样使用起来非常方便。

views.py文件中实现向数据库表中添加一条数据,示例代码如下:


from django.http import HttpResponse
from  .models import User,Article

def index(request):
    # 向数据库表中添加一条数据,首先要先将被引用的表添加数据,并进行保存
    user = User(username='孤烟逐云', password='hello')
    user.save()
    article = Article(title='Python', content='真好')
    article.author = user
    article.save()
    return HttpResponse("Success ! ")
    
为什么使用了ForeignKey后,就能通过author属性访问到对应的user对象呢?

因为在底层,Django为Article表添加了一个属性名_id的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过article.author访问的时候,实际上是通过author_id找到对应的数据,然后再提取user表中的这条数据,形成一个模型。

展示表User中的数据:

展示表article中的数据:

views.py文件实现从数据库表中查询数据,并且打印输出,示例代码如下:


from django.http import HttpResponse
from  .models import User,Article

def index(request):
    article = Article.objects.all()
    print(article)
    return HttpResponse("Success ! ")
此时的打印结果为:

重写Article类的__str__(self)方法,将数据显示出来,示例代码如下:
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('User',on_delete=models.CASCADE)

    def __str__(self):
        return "<(Article id: %s, title: %s, content: %s, author: %s)>" % (self.id, self.title, self.content, self.author)
再次运行项目进行打印输出,数据具体信息:

2. 使用外键引用另外一个app的模型

那么应该在传递to参数的时候,使用app.model_name进行指定。以上例为例,如果User和Article不是在同一个APP中,那么在引用的时候的示例代码如下:
# Book模型在book,app中,
from django.db import models

class Book(models.Model):
# 定义属性,出版社的地址
    pub_add = models.CharField(max_length=100)

# 在article模型中进行外键引用
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 使用外键引用同一个app下的模型
    author = models.ForeignKey('User',on_delete=models.CASCADE)
    # 使用外键引用不同app下的模型
    pub = models.ForeignKey('book.Book',on_delete=models.CASCADE)
在使用命令python manage.py migrate将迁移脚本文件映射到数据库中的过程中,出现django.db.utils.IntegrityError: (1452, ‘Cannot add or update a child row: a foreign key constraint fails (orm_relationship _demo.#sql-158c_79, CONSTRAINT article_article_pub_id_e2e65cb7_fk_book_book_id FOREIGN KEY (pub_id) REFERENCES book _book (id))‘)
解决办法就是将settings.py文件中的DATABASE配置"default"变量中,添加:
# 取消对外键的检查
 'OPTIONS':{
        "init_command":"SET foreign_key_checks = 0;",
    }
之后再次使用命令python manage.py migrate 就没有任何错误出现了。
来到navicat中查看映射生成的表:
book表中的字段信息

article表中的字段信息:

查看article_artilce表中外键的引用情况,由输出信息可以看出,引用了同一个app:article中的user表和不同app:book中的book表。

3.使用外键引用本身模型

‘to‘参数可以为‘self‘,或者是这个模型的名字,在论坛开发中,一般的评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用资深了,示例代码如下:
class Comment(models.Model):
    content = models.TextField()
    origion_comment = models.ForeignKey('self',on_delete=models.CASCADE)
查看article_comment这个表:

原文地址:https://www.cnblogs.com/guyan-2020/p/12219607.html

时间: 2024-10-03 23:26:27

55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解的相关文章

055:ORM外键使用详解

外键:在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam .如果使用的是 InnoDB 引擎,是支持外键约束的.外键的存在使得 ORM 框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在 Django 中的使用. 类定义为 class ForeignKey(to,on_delete,**options) .第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE . SET_NULL 等.

Django中ORM外键和表的关系(Django编程-4)

外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在Django中的使用. 类定义为class ForeignKey(to,on_delete,**options).第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE.SET_NULL等.这里以一个实际案例来说明.比如有一个

python django中的orm外键级联删除

今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: 在网上查了一下资料,问题主要是django orm的field字段有关: routemgr = models.ForeignKey('Routemgr',default=1,blank=True,null=True,on_delete=models.SET_NULL) 主要意思就是把Routemg

ORM外键关联

#coding=utf-8 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String,DATE,ForeignKey from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mys

056:ORM外键删除操作详解

外键删除操作: 如果一个模型使用了外键.那么在对方那个模型被删掉后,该进行什么样的操作.可以通过 on_delete 来指定.可以指定的类型如下:1.CASCADE :级联操作.如果外键对应的那条数据被删除了,那么这条数据也会被删除.2.PROTECT :受保护.即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据.3.SET_NULL:设置为空.如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空.如果设置这个选项,前提是要指定这个字段可以为空.4.SET_DEFAUL

Django学习手册 - ORM 外键

Django 外键操作 关键语法: models.ForeignKey("UserGroup",to_field="gid",default=1,on_delete=models.CASCADE) 参数: "UserGroup"  #外键另外一张表 to_field="gid" #另外一张表的字段 on_delete=models.CASCADE  #因为不加这个会报错相关(https://www.cnblogs.com/ph

【转】linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解----不错

原文网址:http://blog.csdn.net/liaoxinmeng/article/details/5004743 首先: 1.终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念.一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种.控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.话回到个人计算机上,个人计算机只有控制台,没

Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二

准备工作:新建第一个JavaWeb项目 step3 给第一次配置tomcat的家伙们再说一遍如何配置tomcat 3.1 [Run]-[Edit Configurations] 3.2 [Default] 3.4[TomEE Server/Local]-[Server]-[Configuration] 3.5 [1]-[2tomcat解压后的第一级根目录就好,它的下一级有bin/conf等] 3.6 配置好tomcat目录后是酱了滴~忽略那个Warning~ 3.7 [Deployment]-[

jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系

四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库生成数据表: #django默认在makemigrations会为表对象创建主键id,id = models.AutoField(primary_key=True) 你也可以自定义一个主键对象: 4.2.1: 生成迁移文件python manage.py makemigrations 4.2.2执行