Модель Django без атрибута БД - PullRequest
0 голосов
/ 18 января 2012

Folks Скорее всего, я делаю глупую ошибку.

У меня есть модель с именем Comment - обычная модель, за исключением того, что я хочу сохранить массив внутри модели (массив не хранится в БД).

Теперь мой код выглядит примерно так:

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)

Моя проблема заключается в том, что печать во втором последнем цикле for показывает правильное значение для c.attachments, тогда как печать внутри последующего цикла for показывает пустое значение для той же записи. Это неожиданно, поскольку оба цикла находятся над одним и тем же массивом комментариев!

Я, скорее всего, упускаю что-то очевидное и глупое - если кто-то может определить проблему, пожалуйста, ответьте.

Thanx!

- Обновление:

@ Анураг

Ваше предложение, похоже, не работает. Кажется, на самом деле это не интуитивно понятно, если зацикливание набора запросов приводит к другому запросу - возможно, 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)

Обновление 2:

Я не совсем уверен, почему, но это работает, если я подставляю строку

del c.attachments[:] 

с

c.attachments = []

Я не могу ответить этим ответом до 8 часов ..

Ответы [ 2 ]

0 голосов
/ 21 января 2012

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

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 голосов
/ 18 января 2012

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

...