settings 相关配置
# settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangos',
'USER': 'root',
'PASSWORD': '990212',
'HOST': 'localhost',
'PORT': '33062',
}
}
# 安装数据库驱动
pip install mysqlclient==2.1.1
pip install pymysql
# 与manage.py同级目录下的__init__.py
import pymysql
pymysql.install_as_MySQLdb()
# 数据迁移命令
python manage.py makemigrations appname
python manage.py migrate
# 在数据库中 配置好数据表后,逆向生成model
python manage.py inspectdb table1 table2 table3 > appname/models.py
模型关联与映射
- 一对一映射
- 一对多映射
- 多对多映射、多对多自定义中间表
- 自关联
一对一映射
使用场景
- 扩展模型信息
- 限制关联模型的数量:确保一个模型只能与另一个模型关联一次
eg:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE())
bio = models.TextField(blank=True)
profile_picture = models.ImageField(upload_to="profile_pictures", blank=True)
def __str__(self):
return self.user.username
class UserAddress(models.Model):
user_profile = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
street_address = models.CharField(max_length=100)
city = models.CharField(max_length=50)
state = models.CharField(max_length=50)
postal_code = models.CharField(max_length=10)
def __str__(self):
return f'{self.user_profile.username}\'s address'
扩展了django自带的用户模型
使用 OneToOneField 创建对应关系,在例子中 使用一对一映射,来控制每个用户只能有一个地址。
注意点
-
参数:on_delete
-
主对象被删除时,如何处理关联对象。若使用一对一映射则必须指定 on_delete 参数。
-
on_delete=models.CASCADE
: 级联删除,关联对象被删除后,其关联字段同时也被删除。 -
on_delete=models.PROTECT
:保护关联对象, 当关联对象将被删除时,出发 ProtectedError 异常。 -
on_delete=models.SET_NULL, null=True
: 当关联对象被删除时,将关联字段设置为NULL, 前提是该字段允许为空。 -
on_delete=models.setDEFAULT, default=1
:当关联对象被删除时,将关联字段设置为其默认值,前提是该字段设置了默认值。文章来源:https://www.uudwc.com/A/vmpGG/ -
on_delete=fun_cname
: 在 func_name(instance, **kwargs) 自定义删除操作, instance 表示要删除对象的引用。文章来源地址https://www.uudwc.com/A/vmpGG/def delete_action(instance, other_args): ... def pack_delete_action(other_args): other_args = ... return lambda instance: delete_action(instance, other_args) class UserTest(models.Model): test_field = models.OneToOneField(User, on_delete=pack_delete_action("some...info.."))
-