在Django中只获取相关对象的某些字段

问题描述 投票:4回答:3

说我在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对象,不适用于模型实例。我的问题是:有没有办法只使用“评论”对象做同样的事情?它必须等于select name, email from users where id=comment.user_id的复杂性(当我不需要时,我不想通过网络传输存储在某些字段中的大量数据)

python django
3个回答
2
投票

如果你想要一些其他用户数据的注释,而不必检索整个User对象,我相信在你获取注释时最好获取额外的数据:

Comment.objects.filter(user=user).values_list('user__name', 'user__email')

显然你可以获取其他有用的Comment字段。

要么:

Comment.objects.filter(user=user).annotate(author_name=F('user__name'),\ 
                                           author_email=F('user__email'))

这仍然使用QuerySet API,但这两种方法都允许您跨越关系以获得额外的数据,而无需额外的查询。


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()

0
投票
Users.objects.filter(id=comment.user_id).values_list('name', 'email').get()

那应该做

© www.soinside.com 2019 - 2024. All rights reserved.