1

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

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

真的谢谢你的帮助=)

4

1 回答 1

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和。还有karthikr推荐的方法。first_namelast_nameget_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')
于 2013-05-13T04:11:24.500 回答