Люди Я делаю глупую ошибку, скорее всего.Django model non db attribute
У меня есть модель под названием Комментарий - обычная модель - кроме того, что я хочу сохранить массив в модели (массив не хранится в db).
Теперь мой код выглядит что-то вроде:
class Comment(model.Model):
# regular attributes such as id etc.
#...
attachments = [] # the attribute I would populate separately
# later...
comments = Comment.objects.filter(...)
comment_attachments_arr = [some array initialized from db separately]
# set the attribute after retrieving from the db
for c in comments:
comment_attachments_arr = comment_attachments.get(c.id)
del c.attachments[:] # reset the attachments array
if comment_attachments_arr:
c.attachments.extend(comment_attachments_arr)
print 'INSIDE for comment id: %s, comment attachments: %s' %(c.id, c.attachments)
for c in comments:
print 'OUTSIDE for comment id: %s, Comment attachments: %s\n' %(c.id, c.attachments)
Моя проблема заключается в том, что печать в предпоследнем для цикла показывает правильное значение для c.attachments - в то время как печать внутри цикл, который непосредственно следует шоу пустое значение для той же записи. Это неожиданно, потому что обе петли над одним и тем же массивом комментариев!
Скорее всего, я пропустил что-то очевидное и глупое - если кто-нибудь может определить проблему, ответьте.
Thanx!
--update:
@Anurag
Ваше предложение не похоже на работу. Кажется, что это неинтуитивно, если в результате цикла с запросом возникает другой запрос - возможно, django всегда хочет получить последние данные.
В любом случае, я попытался следующие:
comments_list = list(comments)
for c in comments_list:
comment_attachments_arr = comment_attachments.get(c.id)
del c.attachments[:] # clear the attachments array
print 'BEFORE INSIDE for comment id: %s, comment attachments: %s' %(c.id, c.attachments)
if comment_attachments_arr:
c.attachments.extend(comment_attachments_arr)
print 'INSIDE for comment id: %s, comment attachments: %s' %(c.id, c.attachments)
print '\n\nFINAL comment attachments ---'
for c in comments_list:
print 'OUTSIDE for comment id: %s, Comment attachments: %s\n' %(c.id, c.attachments)
Update 2:
Я точно не знаю, почему, но это работает, если я заменить строку
del c.attachments[:]
с
c.attachments = []
I c не ответите на этот ответ до 8 часов.
У вас нет «массива», у вас есть список. У Python есть массив, но это не то, что вы используете. – jknupp
@jknupp - с какой структурой данных вы ссылаетесь? Атрибут «attachments» в модели Comment?Если вы говорите о comment_attachments_arr - его неправильно называют (извините) - это dict с ключом как число (id) и значение как массив. – serverman
@jknupp: Python 'list' - это массив (или вектор) - это не связанная структура данных, о чем большинство людей думает, когда читают« список ». – Marcin