#django #json #serialization #models
#django #json #сериализация #Модели
Вопрос:
Я хочу сериализовать модели таким образом:
class Schedule(models.Model):
Title = models.CharField(max_length=512)
class ScheduleEvent1(models.Model):
ScheduleContent = models.ForeignKey(Schedule)
Description = models.TextField()
class ScheduleEvent2(models.Model):
ScheduleContent = models.ForeignKey(Schedule)
AnotherField = models.TextField()
ShortDescription = models.TextField()
создайте что-то вроде serializers.serialize('json', Schedule.objects.all())
Результат нравится
[
{
"pk": 2,
"model": "Schedule",
"fields": {
"Title": "Some Title",
"ScheduleEvent1": [
{
"pk": 19,
"model": "ScheduleEvent1",
"fields": {
"Description": "Some Descr",
}
},
{
"pk": 20,
"model": "ScheduleEvent1",
"fields": {
"Description": "Some Descr2222",
}
}
],
"ScheduleEvent2": [
{
"pk": 15,
"model": "ScheduleEvent2",
"fields": {
"AnotherField": "Some text",
"ShortDescription" : "Some text ...",
}
}
]
}
}
]
В общем. У меня есть дерево сущностей. И мне нужно сериализовать это дерево из корня.
прошу помощи у tnx.
Комментарии:
1. Какая у вас проблема? Это довольно легко сделать в Django. Это еще проще, если вы используете Piston. Пожалуйста, опубликуйте свой код и ошибки, которые вы получаете.
2. Ох. Я не знаю, как я могу это сделать: (Не могли бы вы показать пример кода?
3. В моем примере у меня есть только часть моего дерева. На самом деле глубина дерева может быть больше 2.
4. @Andrey: 1) Запрос. docs.djangoproject.com/en/1.3/topics/db/queries 2) Сериализовать. docs.djangoproject.com/en/1.3/topics/serialization Мне не нужно предоставлять код. Это уже есть в документации для Django. Какая у вас проблема? Пожалуйста, опубликуйте свой код и ошибки, которые вы получаете.
5. Я прочитал документацию. Я могу сериализовать этот пример. Но я не могу сериализовать более сложный случай, в котором: 1) Более двух разных моделей ScheduleEvent (ScheduleEvent3, ScheduleEvent4, ScheduleEvent5, ScheduleEvent6, …); 2) Глубина дерева больше 2. Расписание имеет Session = models. ForeignKey (сессия), сессия имеет OneMoreModel = models. Внешний ключ (OneMoreModel). И я хочу написать что-то вроде serializers.serialize(‘json’, OneMoreModel.objects.all()) и получить полный json.
Ответ №1:
http://docs.djangoproject.com/en/1.3/topics/serialization/#dependencies-during-serialization
Раскрывает суть этого. Результирующий файл — это не точно то, что требуется, поскольку объекты не будут вложенными. Однако это то, что Django создает по умолчанию, и это то, что Django будет использовать для десериализации.
Если вы используете Piston, вы можете легко определить обработчик, который будет выдавать вложенный JSON, но он не будет точно таким, как показано, потому что JSON-эмиттер Piston не совсем соответствует формату Django.
Получение именно того, на что надеялись, приводит к расширению сериализатора Django для создания вложенного объекта JSON в качестве естественного ключа. Смотрите http://code.djangoproject.com/browser/django/trunk/django/core/serializers/python.py. Строки 47-59
Или вы можете определить natural_key
метод, который использует ‘django.core.serializers.json ‘ от django .Serializer` для выдачи сериализации объекта в формате JSON вместо какого-либо другого значения естественного ключа. Это немного странно семантически, но это может сделать то, что вы хотите.
Комментарии:
1. Прошу помощи у Tnx. Я буду использовать Piston.