我用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。
谢谢
答案 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()