2012-01-17 5 views
0

Люди Я делаю глупую ошибку, скорее всего.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 часов.

+0

У вас нет «массива», у вас есть список. У Python есть массив, но это не то, что вы используете. – jknupp

+0

@jknupp - с какой структурой данных вы ссылаетесь? Атрибут «attachments» в модели Comment?Если вы говорите о comment_attachments_arr - его неправильно называют (извините) - это dict с ключом как число (id) и значение как массив. – serverman

+0

@jknupp: Python 'list' - это массив (или вектор) - это не связанная структура данных, о чем большинство людей думает, когда читают« список ». – Marcin

ответ

-1

Чтобы прикрепить его к экземпляру модели, вам необходимо написать self.attachments.

+0

Не уверен, что вы имеете в виду. Вложение - не что иное, как простой массив с некоторыми данными, которые я пытаюсь связать с каждым экземпляром комментария. – serverman

+0

вложения - это атрибут класса в вашем коде, который делится между экземплярами объекта. Если вы хотите один на один экземпляр, вам нужно написать 'def __init __ (self): self.attachments = []' – jknupp

-1

Существует огромное различие между двумя утверждениями.

del c.attachments[:] 

и

c.attachments = [] 

del c.attachments[:] фактически сбрасывает список. Но, делая c.attachments = [], пустым списком присваивается c.attachments. Под этим я имею в виду, что другие связанные с переменными все еще будут иметь старый список. Вы можете увидеть разницу, выполнив следующие примеры в оболочке python.

>>>a=[1,2,3] 
>>>b=a    #b is also [1,2,3] 
>>>del a[:]   #after this both would be [] 

и

>>>a=[1,2,3] 
>>>b=a    #b is also [1,2,3] 
>>>a=[]    #after this a would be [] and b would be [1,2,3] 

Я надеюсь, что это помогает вам. :)

+0

Есть ли что-то неправильное, что я объяснил выше, что я получил голос? Если это действительно неправильно, я всегда буду любить обсуждать и получать знания из этого. :) –