2014-09-20 1 views
0

Пусть говорят, у меня есть этот код:Лучший способ цикла/изменить некоторые объекты в object_list

# Get 30 threads 
threads = Thread.objects.all()[:30] 
threads_id = [o.pk for o in threads] 
# Extra info about threads that the user have visited 
visited_threads = VisitedThread.objects.filter(pk__in=threads_id, user=request.user) 

# I want to loop the visited_threads and add info to thread in threads with new info 
for visited_thread in visited_threads: 
    # Here I want to add things to thread (visited_thread.thread), something like: 
    # thread.has_unread_post = thread.post_count > visited_thread.post_count 

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

ответ

3

Пример кода, который вы показали, в порядке, по крайней мере, в общих чертах. После того, как вы начнете выполнять итерацию над запросом, Django создаст экземпляры модели памяти, и вы можете добавлять атрибуты к версиям в памяти, как и любой другой объект Python.

Чтобы иметь возможность редактировать темы из ваших первых СМО на основе второй:

threads = Thread.objects.all()[:30] 
threads_by_pk = dict((t.pk, t) for t in threads) 
# Extra info about threads that the user have visited 
visited_threads = VisitedThread.objects.filter(pk__in=threads_by_pk.keys(), user=request.user) 

# I want to loop the visited_threads and add info to thread in threads with new info 
for visited_thread in visited_threads: 
    thread = threads_by_pk[visited_thread.pk] 
    thread.has_unread_post = thread.post_count > visited_thread.post_count 
+0

Да, но как я могу добавить атрибут нить в потоках? Скажем, я посетил_thread с visit_thread.thread.id = 12. Как добавить атрибуты thread.id = 12 в потоки? – Spindel

+0

Я бы построил словарь PK для потоковых экземпляров из набора запросов к потокам, затем вы можете искать экземпляры в потоке памяти в своем цикле для добавления атрибута. –

+0

Не могли бы вы привести пример кода? – Spindel

Смежные вопросы