2013-05-13 46 views
1

我試圖讓在Django的應用程序,但我需要做在Django一個JOIN,一斤這樣的:加入Django?

SELECT User.name, Post.contain from User, Post where Post.User_id = User.id; 

霍伊可我得到的User.name?

我的模型是

from django.db import models 
from django.contrib.auth.models import User 


class Post(models.Model): 
    titulo = models.CharField(max_length = 60) 
    contenido = models.TextField(max_length = 140) 
    fecha = models.DateTimeField(auto_now_add = True, blank = True) 
    usuario = models.ForeignKey(User) 

    def __unicode__(self): 
     return self.titulo 

真的很感謝你的幫助=)

回答

2

大多數時候,你不應該擔心連接。這是ORM的工作。

posts = Post.objects.filter(user=user) 

第一個查詢後,用戶應在ORM緩存,所以除非你發現性能瓶頸不用擔心性能(過早的優化是所有罪惡的根源)。

{% for post in posts %} 
    {% if forloop.first %}<h1>{{ post.user.name }}{% endif %} 
    <li>{{ post.contain }}</li> 
{% endfor %} 

如果你真的想成爲一個控制狂:

posts = Post.objects.select_related().filter(user=user_id)\ 
            .values('user__name', 'contain') 

[更新]

django.contrib.auth.models.User缺乏一個叫name場。它有username,first_namelast_name。 karthikr也建議get_full_name方法。

以下是什麼結果?

Post.objects.filter(user=user_id) 

模板應該是:

{% for post in posts %} 
    {% if forloop.first %} 
    <h1>{% trans 'Posts for' %} 
     {{ post.usuario.get_full_name|default:post.usuario.username }} 
    </h1> 
    <ul> 
    {% endif %} 
     <li>{{ post.contenido }}</li> 
    {% if forloop.last %} 
    </ul> 
    {% endif %} 
{% endfor %} 

嘗試同樣的查詢集沒有過濾器,看看問題是否與過濾器(就像沒有職位的用戶)。

Post.objects.select_related().filter(usuario=user_id)\ 
         .values('usuario__username', 'contenido') 
+0

{{post.user.name}}應該是{{post.user.get_full_name}} – karthikr 2013-05-13 04:23:03

+1

@karthikr:在OP段已'User.name',我不能假設'User'是來自'django.contrib.auth.models.User'的同一個對象。 – 2013-05-13 04:26:18

+0

我嘗試了殼,但給我一個空集。 =([] – 2013-05-13 04:52:46