仅获取Djang中相关对象的某些字段

2024-05-20 04:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在Django有这样的模特:

class User(models.Model):
    name=models.CharField(...)
    email=models.EmailField(...)
    photo=...
    <other fields>

class Comment(models.Model):
    user=models.ForeignKey(User, ...)

我有一个接收Comment对象的函数,只需要name和email字段就可以发送电子邮件(很明显,这只是一个示例)

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


Tags: 对象djangonameidmodelmodelsemailcomment
3条回答

如果您希望有带有一些额外用户数据的注释,而不必检索整个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'))

这仍然使用QuerySetAPI,但是这两种方法都允许您跨越关系来获取额外的数据,而无需额外的查询。

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

应该可以的

It must be equal to select name, email from users where id=comment.user_id by complexity.

与此查询真正等价的是您已经拥有的:

Users.objects.filter(id=comment.user_id).values_list('name', 'email')

... but values_list only applicable to QuerySet object, not to model instance.

那是绝对正确的。但是您需要考虑的是,一旦您有了这个queryset,就可以得到第一个元素,因为只有一个用户id,就只有一个用户:

name, email = Users.objects.filter(id=comment.user_id).values_list('name', 'email').first()

相关问题 更多 >