django中向models.py添加新字段

本文详细介绍了在Python项目中如何通过models.py文件增加新字段,并提供了执行SQL语句的具体步骤和注意事项,包括如何正确修改表名、处理字段类型及默认值等问题。

每写一篇文章我都要长呼一口气,不是写文章累,而是每次解决文章中的问题都着实花了我不少时间大哭

正文:

1、在models.py中增加你想要的新字段


2、查看刚才添加的新字段

      进入到项目文件manage.py所在目录,执行“python manage.py  sqlall [appname]”,记下下图箭头所示文字

3、进入python shell


4、执行以下语句


容易出错的地方:

1、上面的第一个箭头指向的blog要改成你自己对应的表名

2、下划线是第2步中看到的内容,但是最后对于NOT NULL型的要加上默认值DEFAULT china,否则可能报错。

3、第3个箭头所指的右括号不要写成大于号了,另外记得加上分号


参考文章:

1、http://jingyan.baidu.com/article/636f38bb266082d6b84610d7.html

2、http://blog.youkuaiyun.com/xugangjava/article/details/6770817

<think>我们正在讨论Django模型中的两个问题:定义外键和字段加密。 首先,关于定义外键:在Django中,外键用于建立两个模型之间的关系,即一个模型引用另一个模型的主键。 其次,关于字段加密:Django本身不提供内置的加密字段,但我们可以使用第三方库或自定义字段来实现。 步骤1:定义外键 在Django模型中,我们可以使用`models.ForeignKey`来定义外键。例如,如果有一个`Author`模型和一个`Book`模型,每本书有一个作者(外键关联到作者),则可以这样定义: 步骤2:字段加密 对于加密,我们可以使用`django-encrypted-fields`库,它提供了加密的模型字段。或者,我们也可以使用Django的信号(signals)在保存前加密、在读取时解密,但使用现成的库更安全方便。 下面分别给出示例: 1. 定义外键: 假设有两个模型:`Author`和`Book`,其中`Book`模型有一个指向`Author`的外键。 2. 字段加密: 使用`django-encrypted-fields`库,首先需要安装:`pip install django-encrypted-fields` 然后在模型中导入并使用`EncryptedCharField`等字段。 注意:加密字段需要设置一个密钥(SECRET_KEY),通常使用Django的SECRET_KEY即可,但建议使用单独的密钥。 示例代码: """ # models.py from django.db import models from encrypted_fields import fields class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=200) # 定义外键,关联到Author模型,on_delete指定当作者被删除时的行为,这里使用CASCADE示级联删除 author = models.ForeignKey(Author, on_delete=models.CASCADE) # 加密字段示例:使用EncryptedCharField secret_info = fields.EncryptedCharField(max_length=100) # 注意:使用加密字段时,我们还需要在settings.py中配置加密字段的密钥(如果库要求的话)。通常,这个库会使用Django的SECRET_KEY,但也可以单独配置。 关于加密字段的更多信息,可以参考django-encrypted-fields的文档。 另外,还有一种常见的加密需求是对敏感信息(如密码)进行哈希处理,但注意哈希和加密是不同的。哈希是单向的(不能解密),而加密是双向的(需要解密)。对于用户密码,Django提供了内置的`User`模型和`make_password`等函数,使用哈希处理,这是更安全的做法。但如果是需要解密的数据(如存储API密钥),则可以使用加密字段。 总结: - 外键:使用`models.ForeignKey` - 加密字段:使用第三方库如`django-encrypted-fields` 注意:使用加密字段可能会影响查询性能,因为数据库中的字段是加密的,所以不能直接进行有效的查询(如过滤、排序等)。因此,只对确实需要加密的字段使用,并考虑性能影响。 生成相关问题: 1. 如何在Django中使用多级外键(即外键指向另一个模型,而该模型又有外键)? 2. 除了使用第三方库,还有哪些方法可以在Django中实现字段加密? 3. 如何管理加密字段所需的密钥? 4.Django中如何对加密字段进行查询? 5. 外键的`on_delete`参数有哪些选项,分别代什么含义?</think>### Django 模型中外键定义与字段加密 #### 1. 外键定义方法 在 Django 的 `models.py` 中定义外键需使用 `models.ForeignKey` 字段类型: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=200) # 外键定义:关联 Author 模型,级联删除 author = models.ForeignKey( Author, on_delete=models.CASCADE, # 主删除时子级联删除 related_name='books' # 反向查询名称 ) publish_date = models.DateField() ``` **关键参数说明**: - `on_delete`:必选项,定义引用对象删除时的行为 - `CASCADE`:级联删除(常用) - `PROTECT`:阻止删除 - `SET_NULL`:设为 null(需设置 `null=True`) - `SET_DEFAULT`:设为默认值 - `related_name`:反向查询名称(如 `author.books.all()`) #### 2. 字段加密方案 Django 原生不提供字段加密,可通过以下方式实现: **方案一:使用第三方库 `django-encrypted-model-fields`** 1. 安装库: ```bash pip install django-encrypted-model-fields ``` 2. 配置 `settings.py`: ```python INSTALLED_APPS = [ ... 'encrypted_model_fields', ] FIELD_ENCRYPTION_KEY = os.environ.get('FIELD_ENCRYPTION_KEY') # 32字符密钥 ``` 3. 在模型中使用: ```python from encrypted_model_fields.fields import EncryptedCharField class UserProfile(models.Model): # 普通字段 user = models.OneToOneField(User, on_delete=models.CASCADE) # 加密字段(存储敏感信息) credit_card = EncryptedCharField(max_length=255) ssn = EncryptedCharField(max_length=255) ``` **方案二:自定义加密字段(基础版)** ```python from django.db import models from cryptography.fernet import Fernet class EncryptedField(models.CharField): def __init__(self, *args, **kwargs): self.cipher = Fernet(settings.FIELD_ENCRYPTION_KEY) super().__init__(*args, **kwargs) def get_prep_value(self, value): return self.cipher.encrypt(value.encode()).decode() def to_python(self, value): return self.cipher.decrypt(value.encode()).decode() ``` #### 3. 重要注意事项 1. **加密字段的局限性**: - 加密后无法直接进行数据库查询(如 `filter(credit_card="xxx")`) - 需在应用层解密后处理数据 - 影响性能(每次读写需加解密) 2. **密钥管理**: - 使用环境变量存储密钥(**切勿提交到代码仓库**) - 定期轮换密钥(需重新加密所有数据) 3. **外键最佳实践**: - 显式声明 `on_delete` 行为 - 使用 `db_index=True` 提高查询效率 - 避免循环引用(A→B→A) > 对于需要高性能的场景,建议将加密字段与非加密字段分开存储,例如将敏感数据存入专用加密服务(如 Vault),在 Django 中只存储引用 ID[^1][^2]。 --- ### 相关问题 1. Django 外键查询如何进行跨过滤(如查询特定作者的所有书籍)? 2. 如何实现加密字段的模糊查询或范围查询? 3. 外键关联删除时如何实现自定义清理逻辑? 4. 除了 `django-encrypted-model-fields`,还有哪些 Django 加密方案? 5. 如何为加密字段设计安全的密钥轮换机制? [^1]: Django 官方模型字段文档:https://docs.djangoproject.com/en/stable/ref/models/fields/#foreignkey [^2]: 大型 Django 应用性能实践:https://docs.djangoproject.com/en/stable/topics/performance/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值