在Django中将字段序列化为JSON对象

时间:2016-01-08 06:04:29

标签: python json django serialization django-queryset

(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&昵称。其他字段,例如电子邮件(实际上,还有其他字段)不应包含在结果中。

1 个答案:

答案 0 :(得分:0)

实际上这是默认的values行为。如果您有一个名为user的字段是 ForeignKey ,则默认的values()调用将返回一个名为user_id的字典键,因为这是存储实际值的隐藏模型属性的名称。当您调用values()并传入字段名称时,您可以传入useruser_id,然后您将返回相同的内容,并且字典键将与您传入的字段名称匹配。

您可以手动执行此操作:

for stat in stats:
     stat['user'] = User.objects.filter(id=stat['user']).values('id', 'nickname')

查看Values() doc了解详情。