【问题标题】:Django: How to get all users with profiles as JSON (extended User model)Django:如何以 JSON 格式获取所有用户(扩展用户模型)
【发布时间】:2017-06-07 13:02:05
【问题描述】:

我已经扩展了 Django 中的默认用户模型。现在我的模型如下所示:

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
birth_date = models.DateField(auto_now=False, auto_now_add=False, default=datetime.now)
phone_number = models.CharField(max_length=13, blank=True, default="")
address = models.CharField(max_length=100, blank=True, default="")
organization = models.ForeignKey(Organization, blank=True, null=True)

一切正常,我可以通过管理面板等添加新用户。 但是,我有一个问题。我需要以以下形式返回对某些请求的自定义 JSON 响应:

[
{"firs_name": first_name, "phone_number": phone_number, ...},
{"firs_name": first_name, "phone_number": phone_number, ...},
...
]

如您所见,phone_number 属性属于 Profile 模型,我无法获取所有包含其 Profiles 的用户(我只能获取用户 ID)。 这是我现在得到的回复:

[{"username": "user", "profile": 2, "first_name": "User", "last_name": "User"}, {"username": "user1", "profile": 3, "first_name": "User1", "last_name": "User1"}, {"username": "user2", "profile": 4, "first_name": "User2", "last_name": "User2"}]

问题:有没有办法通过User.Objects.all()获取所有包含个人资料信息的用户对象?

谢谢!

附: 这就是我制作自定义 JSON 响应的方式:

def get_users_as_json(request):
all_users = User.objects.all().values("username", "first_name", "last_name", 'profile')
user_list = list(all_users)
return JsonResponse(user_list, safe=False)

【问题讨论】:

    标签: python django python-2.7 django-models


    【解决方案1】:

    没有.of方法可以这样做,试试这些

    def get_users_as_json(request):
        col = ["username", "first_name", "last_name", 'profile_id', \
        'profile__phone_number', 'profile__address_no', 'profile__birth_date']
    
        all_users = User.objects.all().values(*col)
        user_list = list(all_users)
        return JsonResponse(user_list, safe=False)
    
    def get_user_as_json(request):
        user_list = []
        users = User.objects.all()
        for user in users:
            user_dict = {}
            user_dict['user_name'] = user.username
            user_dict['first_name'] = user.first_name
            user_dict['phone_number'] = user.profile.phone_number
            user_dict['birthdate'] = user.profile.birth_date
            ...
    
            user_list.append(user_dict)
    
        user_list = list(user_list)
        return JsonResponse(user_list, safe=False)
    

    【讨论】:

      【解决方案2】:

      你可以手动输入所有你想要的变量

      User.objects.all()
          .select_related('profile')
          .values_list('username', ..., 'profile__phone_number', 'profile__address'...)
      

      【讨论】:

      • 是的!我将它用作 User.objects.all().values('profile__phone_number')。谢谢!
      【解决方案3】:

      你可以实现 Django-rest-framework 然后重复这个指令Django Rest Framework nested object response

      我会推荐你​​阅读如何扩展 Django 用户模型,因为看起来你的模型 Profile 只是扩展的用户模型 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#extending-user

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-12
        • 2011-02-28
        • 2013-12-06
        • 2018-01-21
        • 2023-03-22
        • 2018-04-24
        相关资源
        最近更新 更多