加入Django?

时间:2013-05-13 03:56:17

标签: sql django join orm

我正在尝试在Django中创建一个应用程序,但我需要在Django中进行JOIN,Somethin就是这样:

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

非常感谢你的帮助=)

1 个答案:

答案 0 :(得分: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的字段。它有usernamefirst_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')