【发布时间】:2013-08-17 18:15:51
【问题描述】:
在创建和保存(插入数据库)模型实例时,我遇到了与 Django 文档不一致的非常奇怪的行为。由于可能的原因,我已经没有想法了,并且非常感谢任何建议为什么 Django 在这些情况下无法保存所有字段。
我正在使用的这个类:
class Person(models.Model):
user = models.ForeignKey(User)
phone_number = models.CharField(max_length=20, blank=True)
address = models.CharField(max_length=200, blank=True)
这里的代码不起作用,少数情况:
# First Case
new_person = Person()
new_person.user = request.user
new_person.phone_number = '111111'
new_person.save(force_insert=True)
# Second One
new_person = Person(user=request.user, phone_number='111111')
new_person.save(force_insert=True)
# Third One
new_person = Person.objects.create(user=request.user, phone_number='111111')
基于official Django docs 在任何情况下django 都应该创建一个对象并将其插入数据库。
事实上,对象已成功创建(并设置了所有相关字段),但插入 DB 的行仅正确填写了 id 和 user_id 字段,而同样设置的 phone_number 字段保持空白。
但是,访问和更新现有(之前保存的)对象的所有字段没有问题。
从Person 类声明中删除blank=True(通过适当的表更改)不会改变任何内容。
编辑: 问题变得更加复杂。完整的描述和解决方案在下面我自己的答案中
【问题讨论】:
-
第三个应该是
Person.objects.create而不是Person.objects.Create- 小写c -
当你删除
blank=True时,就是对数据库表结构的改变。默认情况下,Django 不承认这一点。您将不得不删除数据库并使用 syncdb 重新创建(痛苦的..),或者运行更改表脚本以不允许空值。 -
@karthikr #1 感谢您的纠正,但这只是在这个问题中犯的一个小错误。#2 我应该提到它,但我也更改了表格中的 null 设置
-
@karthikr: blank=True 仅指表单字段,与数据库字段无关。 null=True 用于 db
标签: django django-models instance