创建并保存非空的Django模型实例作为子类实例的一部分

创建并保存非空的Django模型实例作为子类实例的一部分,django,django-models,instance,Django,Django Models,Instance,在创建和保存(插入DB)模型实例时,我遇到了一个与Django文档不一致的非常奇怪的行为。出于可能的原因,我已经没有什么想法了,如果您能给我一些建议,我将不胜感激。为什么Django在这些情况下无法保存所有字段。 我正在使用的这个类: class Person(models.Model): user = models.ForeignKey(User) phone_number = models.CharField(max_length=20, blank=True) ad

在创建和保存(插入DB)模型实例时,我遇到了一个与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')
在任何情况下,django都应该创建一个对象并将其插入DB

事实上,该对象已成功创建(并设置了所有相关字段),但插入数据库的行只有
id
user\u id
字段正确填充,而同样设置的
phone\u number
字段仍为空

但是,访问和更新现有(先前保存的)对象的所有字段没有问题

Person
类声明中删除
blank=True
不会改变任何内容(通过适当的表更改)

编辑:
这个问题原来更复杂。完整的描述和解决方案在我自己的答案下面

好的,我找到了一个解释

它与继承有关,也就是说,在我想创建Person子类实例的代码中。还有一个班:

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)

class ConnectedPerson(Person):
    connection = models.ForeignKey(AnotherClass)
    # etc..
创建Person实例后,为了将其扩展到ConnectedPerson,我编写了以下代码:

#creating instance of Person:
person = Person(user=request.user, phone_number='111111')
person.save(force_insert=True)

c_person = ConnectedPerson(id=person.id, connection=instance_of_another_c)
使用
ConnectedPerson(id=person.id)
实际上是通过在数据库中覆盖先前创建的person实例来杀死它


因此,对于那些在管理继承实例方面没有太多经验的人:如果您需要使用先前创建的超级类实例作为子类实例的一部分,请按以下方式操作:

#creating person but not saving it
person = Person(user=request.user, phone_number='111111')

######
#later
###### 

#creating subclass instance and saving
c_person = ConnectedPerson(user=request.user, connection=instance_of_another_c)
c_person.save()

#saving super class instance as part of subclass instance
person.pk = super(ConnectedPerson, c_person).pk
person.save()

第三个应该是
Person.objects.create
而不是
Person.objects.create
-小写
c
删除
blank=True
时,它是对数据库表结构的更改。默认情况下,Django无法识别这一点。您必须删除数据库并使用syncdb重新创建(痛苦…),或者运行alter table脚本以不允许空值。@karthikr#1感谢您的更正,但这只是在本问题中犯的一个小错误。#2我应该提到它,但我也更改了中的空设置table@karthikr:blank=True仅指表单字段,与db字段无关。null=True表示数据库