2016-02-20 2 views
1

У меня есть две модели в Django, которые я получаю JSon выходы из:Как объединить этих двух Jsons?

модели (упрощенный)

class ServiceSubCategory(models.Model): 
    service_category = models.ForeignKey(ServiceCategory) 
    name_fa = models.CharField(default='', max_length=200) 
    name_en = models.CharField(default='', max_length=200) 

    def __unicode__(self): 
     return self.service_category.name_fa+' -> '+ self.name_fa 

class Service(models.Model): 
    service_sub_category = models.ForeignKey(ServiceSubCategory) 
    img_fa = models.ImageField(default='img/default_service.png',upload_to='img/service/') 
    caption_fa = models.CharField(default='',max_length=200) 
    caption_en = models.CharField(default='',max_length=200) 

    def as_json(self): 
     return { 
       'id': self.id, 
       'caption_fa': self.caption_fa, 
       'caption_en': self.caption_en, 
       'img_fa': unicode(self.img_fa), 
     } 

Я хочу, чтобы получить первые модели первичных ключей и объединить его с JSON Я получаю от второй модели:

Я получаю JSON от ServiceSubCategory:

[1,2,3,4,5,6,7,8,9,10] 

Запустив этот код:

idJson=json.dumps(list(ServiceSubCategory.objects.values_list('id',flat=True))) 

и получить этот JSon:

[{"caption_fa": "some value", "caption_en": "something", "id": 2, "img_fa": "img/default_service.png"}, 
{"caption_fa": "somthing", "caption_en": "somthing", "id": 1, "img_fa": "img/service/IMAG0099_1H3sdjX.jpg"}] 

К этому

cat = ServiceSubCategory.objects.get(id=1) 
dictionary=[obj.as_json() for obj in Service.objects.filter(service_sub_category=cat)] 

То, что я хочу, чтобы объединить эти два JSons, чтобы получить что-то вроде этого:

[["1":{"caption_fa": "some value", "caption_en": "something", "id": 2, "img_fa": "img/default_service.png"}, 
{"caption_fa": "somthing", "caption_en": "somthing", "id": 1, "img_fa": "img/service/IMAG0099_1H3sdjX.jpg"}], 
["2":{"caption_fa": "some value", "caption_en": "something", "id": 3, "img_fa": "img/default_service.png"}, 
{"caption_fa": "somthing", "caption_en": "somthing", "id": 4, "img_fa": "img/service/IMAG0099_1H3sdjX.jpg"}]] 

Это, как я пытаюсь сделать это:

def service(request): 
    idList=ServiceSubCategory.objects.values_list('id',flat=True) 

    idJson=json.dumps(list(ServiceSubCategory.objects.values_list('id',flat=True))) 
     for i in idList: 
      dictionary=[obj.as_json() for obj in Service.objects.filter(service_sub_category=i)] 
      idJson[i].append(dictionary) #Error 
    return HttpResponse(idJson, content_type='application/json') 

И я получаю сообщение об ошибке в idJson[i].append(dictionary): объект

'' STR не имеет атрибута 'добавляемых'

Я действительно не знаю, как мне это сделать. Любая помощь будет оценена по достоинству.

ответ

0

Таким образом, вместо двух JSONs, я преобразовал Форст массив в массиве строк (["1","2","3",...]) и с помощью zip я слиты два массива, а затем преобразовал его в формат JSON:

idArray='["1","2","3",...]' 
dictionaries='[[{"caption_fa": "some value", "caption_en": "something", "id": 2}, 
{"caption_fa": "somthing", "caption_en": "somthing", "id": 1}], 
[{"caption_fa": "some value", "caption_en": "something", "id": 3}, 
{"caption_fa": "somthing", "caption_en": "somthing", "id": 4}]]' 
import json 
theArray = dict(zip(idArray, dictionaries)) 
theJson = json.dumps(theArray) 

И результат :

[["1":{"caption_fa": "some value", "caption_en": "something", "id": 2}, 
    {"caption_fa": "somthing", "caption_en": "somthing", "id": 1}], 
    ["2":{"caption_fa": "some value", "caption_en": "something", "id": 3}, 
    {"caption_fa": "somthing", "caption_en": "somthing", "id": 4}]] 
+0

, какой бы результат вы не напечатали здесь, это незаконный в python. просто скопируйте его в оболочку python по вашему выбору, и вы увидите – bmbigbang

+0

@bmbigbang. Я протестировал его и получил свой ответ. –

0

Кажется, что у вас есть список словарей и список ключей и вы хотите создать словарь словарей с ключами из второго списка. Вот некоторые упрощенный пример выполнения этого (при условии, оба ваши списки имеют одинаковую длину):

ids = [1, 2, 3, 4] 
dicts = [{'a':'b'}, {'c':'d'}, {'e':'f'}, {'g':'h'}] 
dict_of_dicts = {i:d for i, d in zip(ids, dicts)} 
print dict_of_dicts 
#{1: {'a': 'b'}, 2: {'c': 'd'}, 3: {'e': 'f'}, 4: {'g': 'h'}} 
+0

Это на самом деле не возвращает то, что предлагает ваш ответ. Я получаю пробелы и запятые вместо чисел на выходе JSON –

0

так в текущем определении существует проблема с:

idJson=json.dumps(list(ServiceSubCategory.objects.values_list('id',flat=True))) 

, который возвращает массив, но вы хотите, чтобы это ваш новый Dict, как я понимаю, так что заменить это

idJson={i:[] for i in list(ServiceSubCategory.objects.values_list('id',flat=True))} 

Allthough быть справедливой реализация предложение greenwolf выглядит лучше для элегантности программы

EDIT ** ваш конечный результат должен выглядеть следующим образом:

def service(request): 
    idList = list(ServiceSubCategory.objects.values_list('id',flat=True)) 
    idJson = {i:[] for i in idList} 
    for i in idJson: 
     cat = ServiceSubCategory.objects.get(id=i) 
     dictionary=[obj.as_json() for obj in Service.objects.filter(service_sub_category=cat)] 
     idJson[i].append(dictionary) 
    return HttpResponse(idJson, content_type='application/json') 

в вашем примере, ваш массив имеет пару ключ: значение, а затем другой Dict без ключа. это не разрешено. массивы могут иметь любые объекты, но только целые числа в качестве ключей. dicts может иметь любой хешируемый объект как ключ и любой другой тип как значение для пары ключ: значение.так что ваши варианты либо использовать массив, где индекс имеет прямое отношение к Item ID:

[dict1,dict2,dict3, etc..] 

где ДИКТ (идентификатор) выглядит как один из ваших dicts:

{"caption_fa": "some value", "caption_en": "something", "id": 2, "img_fa": "img/default_service.png"} 

это может быть даже список dicts :

[[dict1,dict3],[dict2,dict4]] 

или вы можете использовать dicts, как было предложено:

{'1': [dict1,dict2], '2': [dict3,dict4]} 
+0

это возвращает '{" 1 ": []," 2 ": []," 3 ": []," 4 ": []," 5 ": [ ], "6": [], "7": [], "8": [], "9": [], "10": []} ' –

Смежные вопросы