пятница, 8 января 2010 г.

Удобные фиксчи

Думаю, этот пост наиболее интересен тем, кто пишет тесты, а тесты в свою очередь завязаны на фиксчи.
{
"pk": 1,
"model": "store.book",
"fields": {
"name": "Mostly Harmless",
"author": 42
}
}
Думаю, знакомая штука )
Вроде бы все отлично, данные мы сохранили.
Но бывает их надо править руками, и тогда начинается настоящий гемор с поиском, т.к. "author": 42 - это совсем не говорящее указание.

Ведь, куда приятнее искать автора не по безликому pk, а по имени.
Кстати, так и сделали )

Теперь, вы можете указать, как будет модель представлять свой primary key.
И получится что-то вроде:
{
"pk": 1,
"model": "store.book",
"fields": {
"name": "Mostly Harmless",
"author": ["Douglas", "Adams"]
}
}

Имхо классно.

Реализация в коде


Надо добавить для модели метод:
def natural_key(self):
return (self.first_name, self.last_name)

Который возвращает тупл, из значений однозначно идентифицирующих объект.

И добавить менеджеру модели (если его нет, то сделайте) метод:
def get_by_natural_key(self, first_name, last_name):
return self.get(first_name=first_name, last_name=last_name)

Вот и все, теперь только указывайте при ./manage.py dumpdata, ключ --natural, и вы получите легкочитаемые фиксчи.

Отдельно стоит сказать о ключах построенных на данных из related объектов.
class Permission(models.Model):
name = models.CharField(max_length=50)
content_type = models.ForeignKey(ContentType)
codename = models.CharField(max_length=100)
# ...
def natural_key(self):
return (self.codename,) + self.content_type.natural_key()

Тут мы создаем ключ с использованием ЗАВИСИМОГО объекта, т.е. если при загрузке в базу, нужный нам ContentType существовать не будет, то все накроется медным тазом c ObjectDoesNotExist.
Для решения проблемы зависимостей нужно их прямо указать:
class Permission(models.Model):
# ...
def natural_key(self):
return (self.codename,) + self.content_type.natural_key()
natural_key.dependencies = ['contenttypes.contenttype']

Ну, вроде все, пойду приделывать natural_key'и )

Предостережение!


Если для вас критична скорость загрузки/выгрузки фиксч, то лучше забудьте все что прочитали выше )

Комментариев нет:

Отправить комментарий