我正在尝试在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
非常感谢你的帮助=)
答案 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
的字段。它有username
,first_name
和last_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')