Django之主键外键详解

在ORM操作处了解的文章中,我们已经初步接触到了主键与外键的字段定义,那么本文以详细介绍主键外键的使用方法等

1.外键

在Django中,外键是一种关系字段,用于建立不同模型之间的关联关系。外键字段允许一个模型引用另一个模型的主键,从而创建模型之间的关系。

使用外键可以实现数据库之间的关联,例如一个博客文章可以有多个评论,每个评论又关联到一个特定的博客文章。在这种情况下,可以在评论模型中使用外键字段来引用博客文章模型的主键。

在Django中,定义外键字段非常简单。只需在模型中的字段中使用ForeignKey类,并指定关联的模型作为参数。例如:

python 复制代码
class Personnel(models.Model):
    id = models.AutoField(verbose_name="工号", primary_key=True, db_index=True)
    name = models.CharField(verbose_name="姓名", max_length=16, null=False)
    age = models.PositiveIntegerField(verbose_name="年龄", default=1)

class Contact(models.Model):
    con_id = models.AutoField(verbose_name="联系表序号", primary_key=True)
    phone = models.CharField(verbose_name="手机号码", max_length=16, null=False)
    address = models.TextField(verbose_name="住址", default='宿舍')
    work_id = models.ForeignKey(to="Personnel", on_delete=models.SET_NULL, null=True)

那么在以上代码中有两个模型,分别是Personnel模型和Contact模型,其中Personnel模型中设定了id这个字段为主键,Contact模型设定了con_id这个字段为主键,work_id为外键,让我们细看work_id这个字段的定义:

  • to:需要传递被外键连接的主表模型作为值,如果连接时主表模型还没定义,建议使用主表模型类名加上"",这样就不会报错。
  • on_delete:需要传递当主表中的一条数据删除时,从表中与这条数据相关联的数据要执行怎样的动作。
  • to_field:允许你指定要引用的目标模型中的特定字段作为外键

to和on_delete这两个参数不可避免,但to_field参数不指定,一般会默认为连接的主表的主键。

那么现在让我们看看on_delete这个参数里面有哪些选项:

  • models.CASCADE:级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
  • models.SET_NULL:当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
  • models.PROTECT:当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
  • models.SET_DEFAULT:当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值,default也可以是一个函数(在任意字段均可),此时可以,注意这时只传递函数名称,django在操作时会帮我们自动执行
python 复制代码
def publisher():
    return Publisher.objects.get(pk=1)

class Book(models.Model):
   name = models.CharField(max_length=64,blank=True)
   content = models.TextField(blank=True)
   pub_time = models.DateTimeField(auto_now_add=True)
   publisher = models.ForeignKey(Publisher,on_delete=models.SET_DEFAULT,null=True,default=publisher)
  • models.SET():当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
  • models.DO_NOTHING:什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
2.主键

Django是一个流行的Python Web框架,它提供了许多强大的功能和工具,用于简化开发高性能、可扩展的Web应用程序。其中一个关键概念是主键(Primary Key),它在数据库中用于唯一标识每个记录。

在Django中,主键是一个特殊的字段,用于确保每个数据库记录的唯一性。默认情况下,Django会自动为每个模型(Model)添加一个名为"id"的主键字段,该字段使用自增长整数作为唯一标识符。

主键在数据库中起着非常重要的作用。它不仅用于确保数据的唯一性,还可以用作数据之间的关联。通过在模型中定义外键(Foreign Key),可以轻松地建立表与表之间的关系,实现数据的连接和查询。

Django提供了多种主键类型,可以根据实际需求选择合适的类型。除了默认的自增长整数主键,还可以使用UUID、字符型字段等作为主键。这样可以更好地适应不同类型的应用程序和数据库需求。

在使用Django开发应用程序时,主键的正确使用非常重要。它不仅能够提高数据的查询效率和准确性,还可以简化代码逻辑和数据管理。通过合理地设计和使用主键,可以实现更高效、可靠的Web应用程序。

总而言之,Django的主键是确保每个数据库记录的唯一性和关联性的重要工具。它为开发人员提供了灵活的选择,以满足各种应用程序和数据库需求。正确地使用主键可以提高数据管理和查询效率,同时简化代码逻辑。

相关推荐
一叶屋檐7 分钟前
Neo4j 图书馆借阅系统知识图谱设计
服务器·数据库·cypher
好吃的肘子1 小时前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_472339461 小时前
MySQL MCP 使用案例
数据库·mysql
lqlj22332 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔3 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务3 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071613 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
Ailovelearning4 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀5 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务5 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide