У меня есть отношения один ко многим в родительских и дочерних таблицах. И пытается выбрать родительскую таблицу с дочерними таблицами как 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 слова. Но вышеупомянутым способом я просто добавляю всех детей в каждый родительский диктант ...

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

1
Tay 18 Фев 2020 в 09:35

2 ответа

Лучший ответ

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

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. 
0
Snickers 18 Фев 2020 в 07:47

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

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

for parent in Parent.objects.all():

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

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

0
Reinstate Monica 18 Фев 2020 в 20:53