(6)模型models(字段类型·字段选项·外键关联·元选项)

本文介绍了Django ORM中模型的字段类型,如FloatField的使用,以及字段选项,强调了必选项如CharField的max_length和ForeignKey的on_delete。此外,还详细讨论了外键关联和元选项(meta)的概念,特别是在定义ForeignKey时需要注意的类定义顺序,以确保数据的完整性和避免错误。

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

ORM:对象*映射*关系   :将Django中的操作转化为对数据库的操作

模型·属性·列表·字段的关系:一个模型类对应一个表,模型类中的属性对应该模型里面的字段

字段类型:浮点类型时用FloatField更加简单

字段选项

关联外键关系

元选项(meta)

from django.db import models
# Create your models here.
class Grades(models.Model):
   gname    = models.CharField(max_length=20)
   gdate    = models.DateTimeField()
   ggirlnum = models.IntegerField()
   gboynum  = models.IntegerField()
   isDelete = models.BooleanField(default=False)
   def __str__(self):
      return "%s-%d-%d" % (self.gname,self.ggirlnum,self.gboynum)

class Students(models.Model):
   sname    = models.CharField(max_length=20)
   sgender  = models.BooleanField(default=True)
   sage     = models.IntegerField()
   scontend = models.CharField(max_length=20)
   isDelete = models.BooleanField(default=False)
   sgrade   = models.ForeignKey(Grades,on_delete=models.CASCADE)
   def __str__(self):
      return "%s-%s-%s" % (self.sname,self.scontend,self.sgrade)
   lasttime=models.TimeField(auto_now=True)
   class Meta:              #定义元选项
      db_table="students"
      ordering=['id']

字段类型

定义Django模型Model的时候,你一定要十分清楚2件事:

  • 这个Field是否有必选项, 比如CharField的max_length和ForeignKey的on_delete选项是必须要设置的。

  • 这个Field是否必需(blank = True or False),是否可以为空 (null = True or False)。这关系到数据的完整性。

  • ForeignKey定义所需的class定义在前面,要不然会报未定义的错误

字段与选项(必选项为黄色标注)

CharField() 字符字段

 

  • max_length = xxx or None

  • 如不是必填项,可设置blank = True和default = ''    #blank=True表示该字段可以为空白,default=‘’设置默认值为空字符串

  • 如果用于username, 想使其唯一,可以设置unique = True

  • 如果有choice选项,可以设置 choices = XXX_CHOICES

TextField() 文本字段

  • max_length = xxx

  • 如不是必填项,可设置blank = True和default = ''

DateField() and DateTimeField() 日期与时间字段

  • 一般建议设置默认日期default date.

  • For DateField: default=date.today - 先要from datetime import date

  • For DateTimeField: default=timezone.now - 先要from django.utils import timezone

  • 对于上一次修改日期(last_modified date),可以设置: auto_now=True

EmailField() 邮件字段

 

  • 如不是必填项,可设置blank = True和default = ''

  • 一般Email用于用户名应该是唯一的,建议设置unique = True

IntegerField(), SlugField(), URLField(),BooleanField()

  • 可以设置blank = True or null = True

  • 对于BooleanField一般建议设置defautl = True or False

FileField(upload_to=None, max_length=100) - 文件字段

  • upload_to = "/some folder/" #将图片上传至什么文件夹下

  • max_length = xxxx

ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,)

  • upload_to = "some folder/"

  • hpicture  =  models.ImageField(upload_to='1UploadImage/%Y%m%d/')
    hcomment  =  models.TextField(blank=True,default='')

ForeignKey(to, on_delete, **options) - 单对多关系

 

  • to必需指向其他模型,比如 Book or 'self' .

  • 必需指定on_delete options(删除选项): i.e, "on_delete = models.CASCADE" or "on_delete = models.SET_NULL" .

  • 可以设置"default = xxx" or "null = True" .

  • 如果有必要,可以设置 "limit_choices_to = ",如下面例子。

  • staff_member = models.ForeignKey( User, on_delete=models.CASCADE, limit_choices_to={'is_staff': True}, )

  • 可以设置 "related_name = xxx" 便于反向查询。

ManyToManyField(to, **options) - 多对多关系

 

  • to 必需指向其他模型,比如 User or 'self' .

  • 设置 "symmetrical = False " if 多对多关系不是对称的

  • 设置 "through = 'intermediary model' " 如果需要建立中间模型来搜集更多信息

  • 可以设置 "related_name = xxx" 便于反向查询。

字段选项


关联外键关系

元选项

<think>我们正在讨论数据库中的关系。用户希望了解字段关联的定义、作用及使用方式。根据引用[1][2],我们可以总结如下:定义:-主(PrimaryKey):是表中唯一标识每一行记录的字段(或字段组合)。主的值必须是唯一的,且不能为空(NOTNULL)。例如,在用户表(tb_user)中,id字段可以作为主。-(ForeignKey):是表中的某个字段(或字段组合),它不是本表的主,但它引用了另一个表的主用于建立两个表之间的关联关系。例如,在地址表(tb_address)中,有一个userid字段,它引用了用户表(tb_user)的主id。作用:1.数据完整性:约束确保只有另一个表的主中存在的值才能被插入到字段中,从而防止无效数据的产生。2.数据一致性:当主表中的数据被更新或删除时,约束可以定义相应的操作(如CASCADE、SETNULL等)以保持数据的一致性。3.建立表间关联关系数据库实现表与表之间关系的重要手段,使得数据能够通过关联查询(如JOIN)被有效地组织使用。使用方式:1.在创建表时定义约束:```sqlCREATETABLEtb_address(idINTPRIMARYKEY,useridINT,addressVARCHAR(255),FOREIGNKEY(userid)REFERENCEStb_user(id));```2.在已有表上添加约束:```sqlALTERTABLEtb_addressADDCONSTRAINTfk_useridFOREIGNKEY(userid)REFERENCEStb_user(id);```3.约束的动作:-ONDELETECASCADE:当主表中的记录被删除时,从表中相关联的记录也会被删除。-ONDELETESETNULL:当主表中的记录被删除时,从表中的字段设置为NULL(前提是该字段允许NULL)。-ONUPDATECASCADE:当主表中的值被更新时,从表中对应的值也更新。4.删除约束:```sqlALTERTABLEtb_addressDROPFOREIGNKEYfk_userid;```根据引用[3],在应用框架(如Odoo)中,我们也可以使用关联字段。但需要注意,当被关联字段是计算字段时,使用related属性可能会导致计算错误(因为环境变量传递问题),此时建议重新定义计算函数。注意事项:-字段的数据类型必须与所引用的主字段的数据类型匹配。-在插入或更新从表记录时,字段的值必须在主表的主中存在(或者为NULL,如果允许的话)。-约束可能会影响性能(特别是在大数据量时),因为每次修改字段都要检查主表的主。例子说明:假设有两个表:部门表(department)员工表(employee)。-部门表的主是id,每个部门有唯一的id。-员工表有一个字段dept_id,它作为引用部门表的id。这样,每个员工都关联到一个存在的部门,保证了员工所属的部门是有效的。通过上述解释,用户应能理解主的基本定义、作用使用方法。</think> ### 字段关联的定义、作用及使用方式 #### 一、定义 1. **主(Primary Key)**[^1] 表中唯一标识每条记录的字段字段组合,需满足: - **唯一性**:值在表中唯一 - **非空性**:不允许NULL值 ```sql CREATE TABLE users ( user_id INT PRIMARY KEY, -- 声明主 name VARCHAR(50) ); ``` 2. **(Foreign Key)**[^2] 从表中引用主表主字段,需满足: - **数据类型匹配**:需与主字段类型相同 - **引用约束**:值必须存在于主表主中(或为NULL) ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(user_id) -- 声明 ); ``` #### 二、作用对比 | **特性** | 主 | | |-----------------|-------------------------|------------------------------| | **核心作用** | 唯一标识记录 | 建立表间关联 | | **数据完整性** | 实体完整性 | 参照完整性 | | **NULL值** | 绝对禁止 | 允许(需明确配置) | | **表角色** | 主表(父表)[^2] | 从表(子表)[^2] | | **数量限制** | 每表仅一个 | 每表可多个 | #### 三、使用方式 1. **约束声明** ```sql -- 建表时声明 CREATE TABLE child_table ( child_id INT PRIMARY KEY, parent_id INT, FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE -- 级联删除 ); -- 后期添加约束 ALTER TABLE child_table ADD CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id); ``` 2. **数据操作示例** ```sql -- 合法操作(主存在) INSERT INTO orders VALUES (101, 1); -- 假设user_id=1存在于users表 -- 非法操作(违反约束) INSERT INTO orders VALUES (102, 99); -- user_id=99不存在 ``` 3. **约束动作**[^2] | 动作 | 效果说明 | |-------------------|----------------------------------------| | `ON DELETE CASCADE` | 主表记录删除时自动删除从表关联记录 | | `ON DELETE SET NULL`| 主表记录删除时从表设为NULL | | `ON UPDATE CASCADE` | 主值更新时自动更新从表关联字段 | #### 四、框架中的特殊应用[^3] 在Odoo等ORM框架中,关联可能通过声明实现: ```python class Order(models.Model): user_id = fields.Many2one('users') # 自动创建关联 ``` **注意**:当关联字段是计算字段时,避免直接引用`related`属性,可能导致上下文丢失计算错误,建议重写计算函数。 #### 五、使用场景 1. 电商系统:订单表(关联用户表(主) 2. 内容管理:文章表(关联作者表(主) 3. 库存管理:库存记录(关联产品表(主) #### 六、注意事项 1. 确保字段索引以提高JOIN效率 2. 避免循环引用(表A引用表B,表B引用表A) 3. 跨数据库操作时注意不同DBMS的实现差异 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值