(Django 1.8.5)
假设我想打印出每个用户的答案数和不同的问题。
models.py:
class User(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
nickname = models.CharField(db_column='Nickname', db_index=True, max_length=255)
email = models.EmailField(db_column='Email', db_index=True, null=True)
class Question(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='UserId')
class Answer(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
question = models.ForeignKey(Question, on_delete=models.CASCADE, db_column='QuestionId')
user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='UserId')
views.py:
from django.db.models import Count
stats = Answer.objects.values('user').annotate(number_of_answers=Count('id'), number_of_answered_questions=Count('question', distinct=True))
现在,
print(stats[0])
给了我
{'number_of_answered_questions': 4, 'number_of_answers': 5, 'user': 1}
但是,我希望输出看起来像这样:
{'number_of_answered_questions': 4, 'number_of_answers': 5, 'user': {'id':1, 'nickname': 'my_nickname'}}
我的序列化程序(例如UserStatSerializer)应该是什么?
注意:
1)我不会使用序列化程序进行反序列化
2)我只想知道id&昵称。其他字段,例如电子邮件(实际上,还有其他字段)不应包含在结果中。
答案 0 :(得分:0)
实际上这是默认的values
行为。如果您有一个名为user的字段是 ForeignKey ,则默认的values()
调用将返回一个名为user_id的字典键,因为这是存储实际值的隐藏模型属性的名称。当您调用values()并传入字段名称时,您可以传入user
或user_id
,然后您将返回相同的内容,并且字典键将与您传入的字段名称匹配。
您可以手动执行此操作:
for stat in stats:
stat['user'] = User.objects.filter(id=stat['user']).values('id', 'nickname')
查看Values() doc了解详情。