说我在Django中有这样的模型:
class User(models.Model):
name=models.CharField(...)
email=models.EmailField(...)
photo=...
<other fields>
class Comment(models.Model):
user=models.ForeignKey(User, ...)
我有一个接收Comment对象的函数,只需要名称和电子邮件字段来发送电子邮件(这只是示例,很明显)
def sendEmail(comment):
name, email=comment.user.name, comment.user.email
在上面介绍的实现中,Django将获取相关对象User的所有字段(大约等于select * from users where id=comment.user_id
)
使用values_list,我可以获取所需的字段:
Users.objects.filter(id=comment.user_id).values_list('name', 'email')
但values_list仅适用于QuerySet对象,不适用于模型实例。
我的问题是:有没有办法只使用&#34;评论&#34;宾语?
它必须等于
复杂性select name, email from users where id=comment.user_id
(当我不需要时,我不想通过网络传输存储在某些字段中的大量数据)
答案 0 :(得分:2)
如果您希望对其他一些用户数据发表评论,而无需检索整个User
个对象,我相信在您获取评论时获取其他数据会更好:
Comment.objects.filter(user=user).values_list('user__name', 'user__email')
显然,您可以获取其他有用的Comment
字段。
OR:
Comment.objects.filter(user=user).annotate(author_name=F('user__name'),\
author_email=F('user__email'))
这仍然使用QuerySet
API,但这两种方法都允许您跨越关系以获取其他数据而无需额外查询。
答案 1 :(得分:0)
复杂性必须等于
select name, email from users where id=comment.user_id
。
这个查询真正等同于你已经拥有的东西:
Users.objects.filter(id=comment.user_id).values_list('name', 'email')
...但
values_list
仅适用于QuerySet
对象,而不适用于模型实例。
这是绝对正确的。但是你需要考虑的是,一旦你拥有了这个查询集,就可以获得第一个元素,因为只有一个用户id就会有一个用户:
name, email = Users.objects.filter(id=comment.user_id).values_list('name', 'email').first()
答案 2 :(得分:0)
Users.objects.filter(id=comment.user_id).values_list('name', 'email').get()
那应该做