Django CSV Export .. Итерация внутри списка - PullRequest
1 голос
/ 16 февраля 2012

Я просматривал документацию django о том, как экспортировать мои данные в файл CSV, чтобы их можно было импортировать в Excel. До сих пор у меня все получалось, но у меня возникли проблемы с выяснением, как я могу экспортировать поля ManyToMany в моих моделях.

Пока у меня есть

writer = csv.writer(response)
writer.writerow(['A','B', 'C', 'D'])

    for x in case_log_list:
        writer.writerow([x.A,
                x.B,
                for y in x.C.all:
                    y,
                x.D)

где цикл for внутри [list] - это место, где я пытался перебрать объекты ManyToMany в этом поле. Тем не менее, я получаю синтаксическую ошибку, которая не имеет никакого смысла ... я даже делаю это правильно?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012
  1. В вашем списке нет пропускающего ].
  2. Вы не можете поместить цикл внутри списка.

Является ли x.C списком или последовательностью какого-либо рода? Вы намерены записать каждый элемент x.C как отдельное поле в CSV?

Я полагаю, вы намеревались использовать оператор объединения списков +, который берет два списка и склеивает их вместе в один список. Используйте это так:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]

Ваш пример становится:

for x in case_log_list:
    c_list = [item for item in x.C.all]          # turn x.C into a list
    output_list = [x.A, x.B] + c_list + [x.D,]   # assemble list
    writer.writerow( output_list )

Или, если вы хотите быть кратким:

for x in case_log_list:
    writer.writerow ( [x.A, x.B] + [item for item in x.C.all] + [x.D,] )

Примечания:

  • Если x.C.all уже является списком, то есть, если type(x.C.all) is list равно True, то [x.A, x.B] + x.C.all + [x.D,] будет достаточно.

  • c_list = [item for item in x.C.all] - это понимание списка , которое позволяет вам что-то делать со списком без необходимости писать цикл for.

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

  • Однобуквенные имена переменных, такие как x, A, B, C, D, действительно ужасны, потому что они не дают информации о том, какие данные хранит переменная, каков ее тип быть, какие значения он может содержать и т. д. Используйте больше описательных имен переменных, если можете.

1 голос
/ 16 февраля 2012

Вы должны создать данные, прежде чем вставлять их в CSV.

Вы можете получить все данные записи перед выполнением операции записи на этом.

mydata = [x.A,x.B]

mydata += [y for y in x.C.all]
mydata.append(x.D)
# write mydata to the csv.

Таким образом, вы получите данные и сможете напрямую записать их в CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...