Django 1.4.1 и использование естественных ключей при десериализации - PullRequest
3 голосов
/ 11 марта 2012

Следуя документации Django по десериализации, в моем models.py я создал класс:

class PersonManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Person(models.Model):
    objects = PersonManager()
    name = models.CharField(max_length=30, unique=True, blank=False, null=False)

    def __unicode__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Person)

    def __unicode__(self):
            return self.title

Я также создал прибор для Person, "person.json",

[
    { 
        "pk": null,
        "model": "myapp.person", 
        "fields": {
            "name": "josh",
        }
     }
]

и для Book, "book.json",

[
    { 
        "pk": null,
        "model": "myapp.book", 
        "fields": {
            "title": "my book",
            "author": ["josh"]
        }
     }
]

Приборы сохраняются в папке «Светильники».

Я тогда делаю python manage.py sql myapp и python manage.py syncdb, а затем python manage.py loaddata persondata.json. Это работает. (Я вижу введенные данные на странице администратора и получаю хорошее сообщение о количестве вставок.)

Затем я делаю python manage.py loaddata bookdata.json и получаю следующее сообщение об ошибке:

DeserializationError: [u"'[u'josh']' value must be an integer."]

Как это может быть? Почему Django настаивает на том, чтобы я использовал целое число для первичного ключа, когда я объявил PersonManager? Что я пропустил?

(NB. Это все работает нормально, когда я даю author pk непосредственно как целое число.)

1 Ответ

1 голос
/ 11 апреля 2012

Ваш метод менеджера имеет неправильное имя.Это должно быть get_by_natural_key, а не get_by_unique_key.

...