Skip to main content
 首页 » 编程设计

python之django queryset select_related 。 values() 重命名键

2025年05月04日34Leo_wl

使用python3.4 django 2.0.2

模型.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__

请您参考如下方法:

从 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"))