关于django外键设置的问题

在Django2.0中,对外键和一对一关系的定义需加入on_delete参数,以避免数据不一致的问题。本文解释了该参数的作用及可选值,如CASCADE、PROTECT等,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进行一对多表的增删改查的时候,新版django2.0在设置外键的时候要新增一个on_set参数,网上的资料:

在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

举例说明:

user=models.OneToOneField(User)

owner=models.ForeignKey(UserProfile)

需要改成:

user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值

owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值

参数说明:

on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

一般情况下使用CASCADE就可以了。

 

所以在设置外键关联的时候一定要加,外键应该加在主表上,而设置models.ForeignKey()的表为子表。设置外键关联之后,首先要先创建主表,如果主表没有数据就去插入子表那么就会报错,因为子表被主表外键约束了,无法插入信息

### DjangoForeignKey `related_name` 属性的使用方法 在 Django 的模型设计中,`ForeignKey` 是用来表示一种“一对多”的关系。当创建这种关系时,默认情况下会生成一个反向关系管理器,其名称基于关联模型的小写形式加上 `_set` 后缀。然而,在某些场景下,可能希望自定义这个反向关系的名字以便更清晰地表达业务逻辑或者避免命名冲突。 #### 自定义反向关系名 可以通过设置 `related_name` 参数来自定义反向访问属性的名字。例如: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey( Author, on_delete=models.CASCADE, related_name="books" ) def __str__(self): return self.title ``` 在这个例子中,我们为 `Author` 和 `Book` 之间的一对多关系设置了 `related_name="books"`。这意味着可以从某个作者对象轻松获取到他所有的书籍列表而无需使用默认的 `<model>_set` 命名模式[^3]。 #### 查询实例演示 假设已经存在一些记录,则可以这样执行查询操作: ```python author = Author.objects.get(name='J.K. Rowling') print(author.books.all()) # 输出该作者的所有书本 ``` 这里利用了之前设定好的 `related_name` 来代替原本应该使用的 `book_set`. #### 解决字段名字冲突问题一个重要用途是在处理复杂的模型结构时防止出现重复的关系名称从而引发错误。比如在一个应用中有多个地方需要用到类似的连接,如果不加区分可能会引起迁移失败等问题。此时合理配置不同的 `related_name` 就显得尤为重要[^2]. #### 默认行为对比 如果没有显式声明 `related_name`, 则系统会自动采用形如 `<modelname>_set` 这样的约定俗成做法作为反向引用路径的一部分. ### 总结 综上所述,适当运用 `related_name` 不仅可以让代码更加直观易懂,而且有助于规避潜在的技术难题。它是一个非常实用的功能选项,值得开发者深入理解和灵活掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值