Django model 外键 xx_id field

子model:portrait/ability_score/views.py

python 复制代码
from django.db import models


# Create your models here.
class AbilityScore(models.Model):
    index = models.AutoField(db_column="Index", auto_created=True, primary_key=True)
    employee_id = models.CharField(db_column="EmployeeID", max_length=10, default='')
    ability = models.ForeignKey(to='ability_standard.AbilityStandard', on_delete=models.CASCADE,
                                db_column="AbilityID", default=None)
    approved_value = models.CharField(db_column="ApprovedValue", max_length=2, default='')
    upcoming_value = models.CharField(db_column="UpcomingValue", max_length=2, default='')
    create_time = models.DateTimeField(db_column="CreateTime", auto_now_add=True)
    update_time = models.DateTimeField(db_column="UpdateTime", auto_now=True)

    class Meta:
        managed = True
        db_table = 'ability_score'
        constraints = [
            models.UniqueConstraint(fields=['employee_id', 'ability_id'], name='unique_employee_id_ability_id')
        ]

子表:ability_score

父model:portrait/ability_standard/models.py

python 复制代码
from django.db import models

# Create your models here.
class AbilityStandard(models.Model):
    ability_id = models.BigAutoField(db_column='AbilityID', primary_key=True)  # Field name made lowercase.
    department = models.CharField(db_column='Department', max_length=50,default='',
                              db_comment='部门')  # Field name made lowercase.
    ......

注意点:

  • 通过ability = models.ForeignKey(to='ability_standard.AbilityStandard', on_delete=models.CASCADE, db_column="AbilityID", default=None)创建外键时会自动生成一个ability_id的属性。

    • 子model里ability属性实质是父model AblityStandard的对象
    • 子model 里ability_id属性是int和父model主键ability_id保持一致。
    • 子表ability_score里AilityID列是子model的ablity_id属性的值和父model主键ability_id保持一致。
    • ability(外键&父model对象)衍生出ability_id(属性&int) 和AilityID(列名)
    • ability_id虽然在子类AbilityScore里明面代码上没有,实际上是存在的,所以在设唯一约束models.UniqueConstraint(fields=['employee_id', 'ability_id'] name='unique_employee_id_ability_id')时可以直接使用而不报错,具体见下图debug信息。
  • models.ForeignKey()函数的to指定app.model_name (ability_standard.AbilityStandard)

  • 引用时不需要import ability_standard ,Django 自动找。

  • 指定了model_name后通过子表外键(ability = models.ForeignKey)关联了父表的主键(ability_id = models.BigAutoField(db_column='AbilityID', primary_key=True))。这时子表的外键(ablitity)实际上时是父表的model的一个对象,因此可以如下直接通过子表外键获取父表属性:其中ability是子表外键,department是父表的属性。

    python 复制代码
    employee_score.ability.department
  • 建立外键时默认为子表添加了一个属性名_id的字段,可单独指定列名db_column,需要给defualt值。

相关推荐
2401_8384725127 分钟前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
CoLiuRs1 小时前
语义搜索系统原理与实现
redis·python·向量·es
zhihuaba1 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
u0109272711 小时前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
野犬寒鸦2 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
Stream_Silver2 小时前
【Agent学习笔记3:使用Python开发简单MCP服务】
笔记·python
我爱娃哈哈2 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
穿过锁扣的风2 小时前
零基础入门 Python 爬虫:从基础到实战,爬取虎扑 / 豆瓣 / 图片全掌握
开发语言·爬虫·python
Stream_Silver2 小时前
【Agent学习笔记2:深入理解Function Calling技术:从原理到实践】
笔记·python
love530love2 小时前
技术复盘:llama-cpp-python CUDA 编译实战 (Windows)
人工智能·windows·python·llama·aitechlab·cpp-python·cuda版本