Ошибка целостности форм Django - PullRequest
0 голосов
/ 06 сентября 2010

Я создал проект с Django и пытаюсь писать из форм в БД. Модельный класс имеет два класса:

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()

Я знаю, что должен заполнить ID человека в этом ForeignKey, но я подумал, что именно так ForeignKey сделает для меня.

Два закомментированных объекта "contact1" не работали. Но это в основном то, что я хочу, добавьте идентификатор к этому.

Кроме того, Django всегда добавляет первичный ключ _id к каждой таблице (контакт и номер телефона).

Так что я не понял, почему, Джанго не добавил к этому.

Как я могу сохранить это в БД с правильным идентификатором, первичным ключом и т. Д.

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 сентября 2010

ForeignKey не может волшебным образом знать, на кого он должен указывать, если вы не скажете это.

В вашем случае, когда вы сделали contact.save(), у вас теперь есть экземпляр контакта, так что вы можете использовать его.

number = PhoneNumber(
    contact = contact,
    phone_type = form.cleaned_data['phone_type'],
    phonenumber = form.cleaned_data['phonenumber'],
)
number.save()
1 голос
/ 06 сентября 2010

Рассмотрим эти две строки:

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()
0 голосов
/ 06 сентября 2010

Как Джанго мог узнать, какие строки должны цепочки?Вы должны передать экземпляр контакта в качестве аргумента для поля внешнего ключа.

contact = Contact(...)
contact.save()
number = PhoneNumber(...)
number.contact = contact # here comes the instance of Contact model
number.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...