【问题标题】:Django JOIN with column renaming to queryset将列重命名为查询集的 Django JOIN
【发布时间】:2014-03-07 14:59:18
【问题描述】:

我正在尝试使用连接和列重命名来构建我的 django 查询集。不幸的是,我的两个字段具有相同的名称,因此查询集没有像我预期的那样返回值。

我的模型是这样的:

class Question(models.Model):
     text = models.CharField('Text', max_length=200, unique=True)

class UserQuestionnaire(models.Model):
     creation = models.DateField('creation date')

class UserChoice(models.Model):
     question = models.ForeignKey(Question)
     questionnaire = models.ForeignKey(UserQuestionnaire)
     text = models.CharField('Text', max_length=200)  # same field name
     votes = models.IntegerField(default=0)

我想要的输出查询如下: select * from polls_userchoice 内加入 polls_question;

返回一个这样的表:

+----+-------------+------------------+------+-------+----+-------+
| id | question_id | questionnaire_id | text | votes | id | text  |
+----+-------------+------------------+------+-------+----+-------+
|  1 |           1 |                3 | 2    |     0 |  1 | text1 |
|  2 |           4 |                3 | 6    |     0 |  2 | text2 |
|  3 |           3 |                3 | 6    |     0 |  3 | text3 |

我的 Django 查询集

user_choice_list = UserChoice.objects.filter(
    questionnaire=user_questionnaire.id).select_related('question')

只返回一个像这样的字典

[{'questionnaire_id': 3L, 'votes': 0L, 'text': u'2', u'id': 1L, 'question_id': 1L},
 {'questionnaire_id': 3L, 'votes': 0L, 'text': u'6', u'id': 2L, 'question_id': 4L},
 {'questionnaire_id': 3L, 'votes': 0L, 'text': u'6', u'id': 3L, 'question_id': 3L}]

所以我的问题是,是否可以在查询期间重命名问题模型的第二个“文本”列,以便我可以从查询集方法访问它?

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    您可以使用values() 代替 select_related()。比如

    user_choice_list = (UserChoice.objects
        .filter(questionnaire=user_questionnaire.id)
        .values(
            'id' , 
            'question_id' , 
            'questionnaire_id', 
            'question__text', 
            'votes', 
            'text'))
    

    【讨论】:

    • 感谢您的回复。不幸的是,django 无法将“question_text”解析为字段。它必须以某种方式重命名。 (我正在使用 django 1.6,如果这可能有帮助)
    • 对不起,它应该是 question__text,我已经在我的回答中编辑了它。
    • 双下划线起到了作用。谢谢您的快速答复。
    • 总是必须使用双下划线访问相关数据。
    猜你喜欢
    • 2018-10-23
    • 2015-06-25
    • 2020-05-27
    • 2021-08-10
    • 2019-04-21
    • 2014-09-27
    • 1970-01-01
    • 2021-11-08
    • 2020-01-09
    相关资源
    最近更新 更多