Django形成完整性错误

时间:2010-09-06 08:15:30

标签: django forms

我用Django创建了一个项目,我正在尝试从表单编写到db。 模型类有两个类:

class Contact(models.Model):
    name = models.CharField(max_length=200)
    birth_day = models.DateTimeField()
    address = models.CharField(max_length=200)

class PhoneNumber(models.Model):
    PHONETYPE_CHOICES = (
        (0, 'Home'),
        (1, 'Work'),
        (2, 'Fax'),
        (3, 'Mobile'),
        (4, 'Other'),
    )
    contact = models.ForeignKey(Contact)
    phone_type = models.CharField(max_length=255, choices=PHONETYPE_CHOICES)
    phonenumber = models.CharField(max_length=30) 

现在,如果我想用表格写这个,我只使用:

名称

生日

地址

数字类型

电话号码

作为表单字段。

我明白了:

IntegrityError x_phonenumber.contact_id可能不是NULL

这是观点的一部分:

def main(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name'],
            birth_day = form.cleaned_data['birth_day'],
            address = form.cleaned_data['address'],
#            contact1= form.cleaned_data['id']
            phone_type = form.cleaned_data['phone_type']
            phonenumber = form.cleaned_data['phonenumber']
            contact = Contact(
                name = form.cleaned_data['name'],
                birth_day = form.cleaned_data['birth_day'],
                address = form.cleaned_data['address'],
            )
            contact.save()
            number = PhoneNumber(
#                contact1 = form.cleaned_data ['id']
                phone_type = form.cleaned_data['phone_type'],
                phonenumber = form.cleaned_data['phonenumber'],

            )
            number.save()

我知道我必须填写该ForeignKey中的人的身份证,但我认为这就是ForeignKey会为我做的事。

两个注释掉的对象“contact1”无法正常工作。但这基本上就是我想要的,将id添加到此。

此外,Django总是为每个表(联系人和Phonenumber)添加一个_id主键。

所以我不明白为什么,Django没有加入这个。

如何使用正确的ID,主键等将其保存到db。

谢谢

3 个答案:

答案 0 :(得分:2)

除非你告诉它,否则ForeignKey不能神奇地知道它应该指向哪个人。

在您的情况下,一旦完成contact.save(),您现在拥有一个联系人实例,因此您可以使用它。

number = PhoneNumber(
    contact = contact,
    phone_type = form.cleaned_data['phone_type'],
    phonenumber = form.cleaned_data['phonenumber'],
)
number.save()

答案 1 :(得分:1)

考虑以下两行:

number = PhoneNumber(
    #   contact1 = form.cleaned_data ['id']
    phone_type = form.cleaned_data['phone_type'],
    phonenumber = form.cleaned_data['phonenumber'],
)

number.save()

您正在创建PhoneNumber的实例并保存它。但是,PhoneNumber的任何实例都需要具有Contact实例的有效外键。这不会在save() PhoneNumber之前设置,因此您会收到错误。

要解决此问题,请在保存电话号码之前将contact个实例的PhoneNumber字段指向您保存的Contact。像这样:

number = PhoneNumber(
    #   contact1 = form.cleaned_data ['id']
    phone_type = form.cleaned_data['phone_type'],
    phonenumber = form.cleaned_data['phonenumber'],
)

number.contact = contact # <===== Attach the contact.
number.save()

答案 2 :(得分:0)

Django怎么会知道它应该链接哪些行? 您必须将联系实例作为外键字段的参数传递。

contact = Contact(...)
contact.save()
number = PhoneNumber(...)
number.contact = contact # here comes the instance of Contact model
number.save()