【问题标题】:Serialize a field as a JSON object in Django在 Django 中将字段序列化为 JSON 对象
【发布时间】:2016-04-12 17:58:06
【问题描述】:

(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 和昵称。其他字段,如 email(实际上也有其他字段)不应包含在结果中。

【问题讨论】:

    标签: python django python-3.x python-2.7 django-queryset


    【解决方案1】:

    事实上,这是默认的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了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 2019-05-17
      • 2011-03-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2021-09-09
      • 2018-03-31
      相关资源
      最近更新 更多