Правильный способ получить родительскую таблицу с ее дочерними таблицами - PullRequest
1 голос
/ 18 февраля 2020

У меня есть отношения один ко многим в родительских и дочерних таблицах. И пытается выбрать родительскую таблицу с дочерними таблицами как json.

Я пробовал что-то вроде ниже.

if (request.method == "GET"):   

    parents = Parent.objects.all()
    datas = []
    childTables = []
    for parent in parents:

        #fetching parent first and creating DICT for json
        #also creating an array for the child tables

        parentDict = {
            "id": parent.id,
            "project_name": parent.project_name,
            childTables: childTables,
        }

        #then fetching child tables NO problem at this part as well.
        childs = parent.child_set.filter(parent_id=parent)
        for child in childs:
            #creating a DICT FOR THE json.
            childDict = {
                "id":child.id,
                "ad_kind":child.ad_kind,
                "parent_id":child.parent_id,
            }

            #i am trying to append project's childs into ParentDict 
            #but still it's appending all childs into every ParentDict...
            #not just its parent's childs.
            parentDict["childTables"].append(childDict)


        #at last append all parent table inside an array and send it as JSON. 
        datas.append(parentDict)

    return JsonResponse(datas, safe=False)

проблема начинается, когда я пытаюсь добавить child tables внутри его parent dict. Но вышеописанным способом я просто добавляю всех потомков в каждый родительский диктант ...

Есть ли какой-нибудь другой более простой способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Python списки изменяемые , и вы создаете только один "childTables" экземпляр списка перед родительским l oop. Ключ словаря, который ссылается на childTables , ссылается на исходный список, поэтому каждое добавление к списку добавляет значения в этот же список.

Чтобы это исправить, просто создайте новый список на каждой родительской итерации:

for parent in Parent.objects.all():

    parentDict = {
        "id": parent.id,
        "project_name": parent.project_name,
        childTables: [],
    }

Кстати, это не лучший способ конвертировать Django наборов запросов в JSON объекты. Для этого я бы рекомендовал использовать django rest framework .

0 голосов
/ 18 февраля 2020

Проблема лежит в вашем childTables массиве. Вы должны поместить его в родительский элемент l oop, и если вы это сделаете, он будет обновляться на каждом l oop. Тогда вы можете получить ожидаемые результаты.

for parent in parents:

    #childTable array placed in here.
    #to renew on each loop.
    childTable = []

    parentDict = {
        "id": parent.id,
        "project_name": parent.project_name,
        childTables: childTables,
    }

    #... the rest is fine. 
...