django ForeignKey 外键和表关系

本文介绍了Django中如何使用ForeignKey建立模型间的关联,并解释了不同on_delete选项的作用。通过实例展示了User与Article模型间的关联方式及如何操作这些关联。

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

表与表之间的关联,我们可以用ForeignKey 建立关联。

 

ForeignKey( to,  on_delete,  **options )

参数一:引用的是哪一个模型(表);

参数二:当使用的外键引用的模型(表)数据被删除了,这个字段该如何处理;具体参数如下有详细说明:

models.ForeignKey('model_name', on_delete=models.CASCADE)

· CASCADE:级别操作,如果外键对应的那条数据被删除了,那么这条数据也会被删除。

· PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。

· SET_NULL:设置为空。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。

· SET( ) : 如果外键那条数据被删除了,那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如 函数 或者 方法),如果是可以调用的对象,那么将这个对象调用后的结果作为值返回回去。

· DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。


 

案例:

这里以一个案例来说明,比如有一个User和一个Articl两个模型,一个User可以发多篇文章,一个Article只能有一个 Author( 假设Author字段存在于User表中 ),并且通过外键进行引用,相关示例如下:

# 父表
class User(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
# 子表
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('User', on_delete=models.CASCADE)

上边author字段实际上引用的就是User模型中的id, 映射到数据库如下:

 

以上使用 ForeignKey 来定义模型之间的关系,即在article的实例中,可以通过 author 属性来操作对应的User模型,非常方便,示例代码如下:

from django.shortcuts import render
from apps.test_three.models import User, Article

def index(res):
    user = User(username='lxc', password='123456')
    user.save()
    article = Article(title='测试标题', content='测试内容')
    article.author = user # 这里直接把User模型赋值给author字段,即可实现外键引用
    article.save()
    return render(res, 'test_html.html')

注意:以上必须先对User模型进行保存,然后才能继续操作Article模型,否则报错以下错误:

映射到数据库如下,下图也能清晰看到author_id也就是author这个字段,引用的就是User表中的id为1的这个条数据:

 

取值:

from apps.test_three.models import Article
def index(res):
    first_article = Article.objects.get(pk=1)
    print("author字段引用的User模型中的username为:%s, password为:%s" % (first_article.author.username, first_article.author.password))
    # 输出: author字段引用的User模型中的username为:lxc, password为:123456
    return render(res, 'test_html.html')

 

引用另外一个应用下的模型:

以上操作我们引用的模型都在同一个应用(apps)内,也就是用一个文件下的,如果引用不用应用的模型(不在同一文件下),也很简单,操作如下:

app(应用名) . 模型的名字

 

外键引用自己本身模型:

引用自己本身模型,那么参数一 ForeignKey( to,  on_delete,  **options ) to 这个参数可以为 "self",或者是这个模型的名字 。在论坛开发中,一般评论可以进行多级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候,就需要使用外键来引用自身。示例代码如下:

class Content(models.Model):
    content = models.TextField()
    origin_content = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
    # 或
    # origin_content = models.ForeignKey('Content', on_delete=models.CASCADE, null=True)

 

未完成,待续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值