2015-04-14 10 views
0

AssuimingВложенный список Джанго

У меня есть один ко многим моделям, как это:

class User(models.Model): 
    username = models.CharField(max_length=255) 

class UserComment(models.Model): 
    user = models.ForeignKey(User) 
    text = models.CharField(max_length=255) 

Как я могу сделать QuerySet в представлении Джанго, чтобы иметь список как следующий?

user_comments= [[username1, [text1, text2, text3]], [username2, [text1, text2]]] 

---- ---- ОБНОВЛЕНИЕ

Я закончил с использованием слегка модифицированный вариант решения Сандер ван Leeuwen

views.py

user_comments = {} 
user_comments = Comments.objects.select_related('envia') 
comments_by_user = collections.defaultdict(list) 
for comment in user_comments: 
    comments_by_user[comment.envia.id].append([comment.envia.first_name+" "+comment.envia.last_name,comment.text,comment.date.strftime('%d/%m/%Y')]) 
comments_by_user.default_factory = None 

template.html

{% for key, values in comments_by_user.items %} 
<ul class="chat-history" id="{{key}}-hist"> 
    {% for val in values%} 
     <li class="opponent unread"> 
     {% for v in val %} 
      {%if forloop.counter = 1 %} 
      <span class="user">{{v}}</span> 
      {% elif forloop.counter = 2 %} 
      <p>{{v}}</p> 
      {% elif forloop.counter = 3 %} 
      <span class="time">{{v}}</span> 
      {%endif%} 
     {% endfor %} 
     </li> 
    {% endfor %} 
</ul> 
{% endfor %} 

ответ

1

Есть ли причина того, что вы хотите, вложенные списки?

Дик будет легче иметь дело. Например:

user_comments = UserComment.objects.select_related('user') 
comments_by_user = defaultdict(list) 
for comment in users_comments: 
    comments_by_user[comment.user.username].append(comment.text) 

Этот выход будет:

{'username1': ['comment', 'comment', ...], 'username2': ['comment', 'comment']} 

Если вы действительно хотите, вложенные списки вы можете сделать:

comments_list = [[username, comments] for username, comments in comments_by_user.items()] 
1

Что-то вроде этого:

user_comments = [] 
for comment in UserComment.objects.select_related('user') \ 
            .order_by('user__username'): 
    if user_comments and user_comments[-1][0] == comment.user.username: 
     user_comments[-1][1].append(comment.text) 
    else: 
     user_comments.append([comment.user.username, [comment.text]]) 
Смежные вопросы