Django / Sqlite3 добавить строку для модели с внешним ключом - PullRequest
5 голосов
/ 06 сентября 2011

Я новичок как в Django, так и в SQlite3.У меня есть модель (Person) с внешним ключом (Person_Type):

class Person(models.Model):
    name = models.CharField(max_length=500)
    pers_type = models.ForeignKey(Person_Type)

    def __unicode__(self):
        return self.name

class Person_Type(models.Model):
    pers_type = models.CharField(max_length=40)

    def __unicode__(self):
        return self.pers_type

Я пытаюсь добавить записи в Person с помощью оболочки python manage.py.

Пока что, Я пытался:

import sqlite3
from trials.models import *

conn = sqlite3.connect('privy.db')
print Person #this returns <class 'privy.trials.models.Person'>
cur = conn.cursor()
fields = ['name', 'pers_type']
row = ['Adam', 'Appellant']
Person.objects.create(**dict(zip(fields, row)))

Но это возвращает ошибку: ValueError: Невозможно назначить «Appellant»: «Person.pers_type» должен быть экземпляр «Person_Type».

Строка "Appellant" уже сохраняется как одно из значений в таблице "Person_Type.pers_type".Что мне нужно изменить, чтобы получить ссылку на поле pers_type?

Рад предоставить больше подробностей, если это необходимо.Большое спасибо за ваше время.

1 Ответ

5 голосов
/ 06 сентября 2011
Person.objects.create(name='Adam', person_type='Appellant') 

Здесь в качестве аргумента person_type метод create () ожидает получить экземпляр person_type, а не строку

Так что просто в широком смысле:

pers_type = Person_Type.objects.get(pers_type='Appelant') # assuming pers_type is unique
Person.objects.create(name='Adam', pers_type=pers_type) 

или с учетом случая, когда «Заявитель» отсутствует в БД:

try:
    pers_type = Person_Type.objects.get(pers_type='Appelant')
except Person_Type.DoesNotExists:
    person_type = Person_Type.objects.create(pers_type='Appellant')
Person.objects.create(name='Adam', pers_type=pers_type)
...