在创建和保存(插入到数据库)模型实例时,我遇到了与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中。
事实上,对象已成功创建(并且所有相关字段都已设置),但插入到DB中的行只有id
和user_id
字段正确填充,phone_number
字段也是设置,仍然是空白。
但是,访问和更新现有(已保存的早期)对象的所有字段都没有问题。
从blank=True
类声明中删除Person
(使用适当的表格更改)不会改变任何内容。
修改 问题变得更加复杂。
下我自己的答案中的完整描述和解决方案答案 0 :(得分:1)
好的,我找到了解释......
它与继承有关,即在代码中我想创建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()