django 查询集 select_related 。 values() 重命名键
Posted
技术标签:
【中文标题】django 查询集 select_related 。 values() 重命名键【英文标题】:django queryset select_related . values() rename key 【发布时间】:2018-10-23 18:02:57 【问题描述】:使用python3.4 django 2.0.2
models.py
class Userinfo(models.Model):
useruid = models.BigAutoField(db_column='UserUID', primary_key=True)
useremail = models.CharField(
db_column='UserEmail', unique=True, max_length=100)
userpassword = models.CharField(db_column='UserPassword', max_length=128)
passwordsalt = models.CharField(db_column='PasswordSalt', max_length=128)
userstatus = models.IntegerField(db_column='UserStatus', default=0)
username = models.CharField(
db_column='UserName', max_length=100, default=0)
class Meta:
managed = False
db_table = 'userinfo'
class Postinfo(models.model):
postuid = models.BigAutoField(db_column='PostUID', primary_key=True)
content = content = models.TextField(db_column='Content')
useruid = models.ForeignKey(
Userinfo, db_column='UserUID', on_delete=models.CASCADE)
class Meta:
managed = False
db_table = 'postinfo'
查询集
postquery = models.Postinfo.objects.all().select_related("useruid").order_by(
'-postuid')
后查询是
<QuerySet ['content': 'test','postuid': 1, 'useruid_id': 1,OtherPosts...>
和
userinfoquery = postquery.values("useruid_id__username","useruid_id__userstatus","useruid_id")
用户信息查询是
<QuerySet ['useruid_id__username': 'firstuser','useruid_id__userstatus': 0, 'useruid_id': 1,OtherUsers...>
我想要 useruid_id__username -> 用户名
useruid_id__userstatus -> 用户状态
useruid_id -> useruid
我试过了
userinfoquery = postquery.values(
useruid="useruid_id", username="useruid_id__username", userstatus="useruid_id__userstatus")
此代码引发异常
QuerySet.annotate() received non-expression(s): useruid_id, useruid_id__uesrname, useruid_id__userstatus.
如何删除 useruid_id__
【问题讨论】:
【参考方案1】:从 Django 1.11 开始,您可以将表达式与 values()
一起使用,请检查 release notes。因此,您需要在查询中添加F
表达式:
from django.db.models import F
userinfoquery = postquery.values(
useruid=F("useruid_id"), username=F("useruid_id__username"), userstatus=F("useruid_id__userstatus"))
【讨论】:
引发此异常The annotation 'useruid' conflicts with a field on the model.
useruid 不在 postquery.values() 中【参考方案2】:
你可以使用注释功能
from django.db.models import F
Postinfo.objects.annotate(renamed_value=F('useruid_id__username')).values('renamed_value')
【讨论】:
以上是关于django 查询集 select_related 。 values() 重命名键的主要内容,如果未能解决你的问题,请参考以下文章
Django查询优化之select_related和prefetch_related
Django select_related 查询不会将所有值返回到模板
pythonのdjango select_related 和 prefetch_related()
Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化