Django ORM使用问题小记

一、执行python manage.py makemigrations app时报错:“You are trying to add a non-nullable field 'name' to contact without a default; we can't do that (the database needs something to populate existing rows)"

原因:

新添加不允许为null、且没有设置defaul的字段时报错。

合理,数据库内存量记录需要默认值填充该字段。

解决方法:

在Django项目app应用下的model.py里,为各个字段设置default。

二、执行python manage.py migrate时告警:“MySQL Strict Mode is not set for database connection 'default'
    HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode”。

原因:

数据库的strict模式没有启用。

解决方法:

可以修改数据库配置文件。

也可以无需修改数据库配置文件,在Django项目下的settings.py中添加如下配置项:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',
        'HOST': 'xxxx',
        'PORT': xxxx,
        'USER': 'xxxx',
        'PASSWORD': 'xxxxxxxx',
        'OPTIONS': {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}

三、使用Django ORM,在应用下的model.py中为字段设置了default。但在执行迁移命令后,生成的数据库表内default未生效:执行describe 表名称查看到Default都为NULL,且执行show create table 表名称发现创建表结构时并未设置default。

原因:

Django的默认值是在框架层面:就是说使用该框架编程来执行insert操作时,是可以生效,自动设置默认值的。

但在数据库层面不行:执行Django迁移命令创建表结构时,并不会在数据库层面设置default。即如果用sql语句或其他框架来执行insert操作,不会自动设置默认值。

解决方法:

当项目仅使用Django ORM框架操作数据库,没有问题。

如果需要使用sql语句添加记录,需要自己填写该字段值,哪怕Django里已设置过默认值。

四、为什么数据库设置的NULL为NO,但在insert时不插入该字段也可以成功?

原因:

概念理解问题:not null不等于不可以插入空值(空字符串等)。not null 指的是不可以将该字段值设置为NULL,但是可以插入空值。

空字符串("")虽然表示“没有值”,但这个值是已知的。NULL 表示 “未知值”,这个值是未知的。

数据库中 SQL 语句该如何处理 NULL 值,你真的了解过吗?

解决方法:

不涉及。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django ORM中,你可以使用`.select_related()`或`.prefetch_related()`方法来执行左连接(left join)操作。这两个方法都用于优化查询,以减少数据库访问次数和提高性能。 以下是对这两种方法的简要说明: 1. `.select_related()`方法: 使用`.select_related()`方法可以在查询时使用左连接,以获取相关联的对象。这对于一对一(OneToOne)或多对一(ForeignKey)关系特别有用。 示例: ```python from myapp.models import ModelA queryset = ModelA.objects.select_related('related_model') ``` 在上面的示例中,我们假设`ModelA`有一个外键字段`related_model`,它与另一个模型相关联。使用`.select_related('related_model')`将执行左连接操作,并在查询结果中包含关联模型的字段。 2. `.prefetch_related()`方法: 使用`.prefetch_related()`方法可以在查询时使用左连接,以在单独的查询中获取相关联的对象。这对于多对多(ManyToMany)关系特别有用。 示例: ```python from myapp.models import ModelA queryset = ModelA.objects.prefetch_related('related_models') ``` 在上面的示例中,我们假设`ModelA`和`ModelB`之间有一个多对多关系,并且通过`related_models`字段进行关联。使用`.prefetch_related('related_models')`将执行左连接操作,并在单独的查询中获取相关联的`ModelB`对象。 请注意,使用这些方法时,确保在查询中使用相关联的字段名称。这样,Django ORM才能正确地识别和执行左连接操作。 希望这可以帮助你在Django ORM中执行左连接操作。如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值