Django:如何让所有用户都拥有JSON(扩展用户模型)的配置文件

时间:2017-06-07 13:02:05

标签: python django python-2.7 django-models

我在Django中扩展了默认的User模型。现在我的模型如下:

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模型,我无法让所有用户都包含其个人资料(我只能获得用户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()获取包含个人资料信息的所有用户对象?

谢谢!

P.S .: 这就是我如何制作自定义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)

3 个答案:

答案 0 :(得分:0)

您可以实现Django-rest-framework,然后重复此指令Django Rest Framework nested object response

我建议你阅读有关如何扩展Django用户模型的内容,因为它看起来像你的模型Profile只是扩展用户模型 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#extending-user

答案 1 :(得分:0)

您可以手动输入所需的所有变量

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

答案 2 :(得分:0)

有很多方法可以这样做,试试这些

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)