【问题标题】:django queryset select_related . values() rename keydjango 查询集 select_related 。 values() 重命名键
【发布时间】: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__

【问题讨论】:

    标签: python django orm django-queryset


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2015-09-22
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2014-03-07
      • 2017-05-25
      • 2015-03-09
      • 2021-06-21
      相关资源
      最近更新 更多