Python 如何序列化模型用户的数据,因为另一个模型用户已满

Python 如何序列化模型用户的数据,因为另一个模型用户已满,python,json,django,django-models,django-serializer,Python,Json,Django,Django Models,Django Serializer,我正在使用一个与contrib.auth.user的模型用户不同的模型来保存我的用户的一些数据,现在我需要使用django.core.serializer和这些模型的一些数据来获取json “Usuario”模型将数据保存为姓名、电话和角色(角色是对用户进行分段的整数) 为了获取查询集并对数据进行序列化,我使用的是该视图 def list_clients(request): clients = User_info.objects.filter(role_id=3) data=se

我正在使用一个与contrib.auth.user的模型用户不同的模型来保存我的用户的一些数据,现在我需要使用django.core.serializer和这些模型的一些数据来获取json

“Usuario”模型将数据保存为姓名、电话和角色(角色是对用户进行分段的整数)

为了获取查询集并对数据进行序列化,我使用的是该视图

def list_clients(request):
    clients = User_info.objects.filter(role_id=3)
    data=serializers.serialize('json',clientes)

    return HttpResponse(data, content_type="application/json")
但下一个是JSON

[{
  "model": "user_info.user_info", 
  "pk": 1, 
  "fields": {
      "username": 1, 
      "name": "George",
      "phone": 5244356, 
      "role": 3
    }
}]
我真的需要用户的用户名,而不是用户的id

我知道可以使用.values()获取此值,但serlizer不支持ValuesQuerySet,并且我得到一个错误:“dict”对象没有属性“\u meta”


如果有人能帮助我,我将不胜感激。

通过添加方法
natural_key
或扩展一个新的(如果扩展一个新的用户模型,请不要忘记在settings.py中设置
auth_User_Model=“User.User”
),更改django.contrib.auth.models(django 1.11.2中的第369行)中的模型

view.py

 clients = News.objects.filter(id=11)
 data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
您将获得:

[{"model": "news.news", "pk": 11, "fields": {"publisher": "schoolms", "view_times": 0, "is_top": false, "status": 0, "publish_time": "2017-06-23T15:37:00", "create_time": "2017-06-23T15:37:53.186", "update_time": "2017-06-23T15:37:53.186"}}]

publisher是您想要的东西,.

通过添加方法
natural\u key
或扩展一个新模型来更改django.contrib.auth.models中的模型
User
(django 1.11.2中的第369行),或者扩展一个新模型(如果扩展一个新的用户模型,不要忘记在settings.py中设置
auth\u User\u Model=“User.User”

view.py

 clients = News.objects.filter(id=11)
 data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
您将获得:

[{"model": "news.news", "pk": 11, "fields": {"publisher": "schoolms", "view_times": 0, "is_top": false, "status": 0, "publish_time": "2017-06-23T15:37:00", "create_time": "2017-06-23T15:37:53.186", "update_time": "2017-06-23T15:37:53.186"}}]

publisher是您想要的东西。

构建序列化程序是为了创建装置:它创建可以导入数据库的模型表示。 如果需要不同的表示,请不要使用序列化程序。只需创建模型的dict表示,并将其提供给json.dumps(),或者直接提供给JSONResponse(如果您在视图中这样做的话)

但是在这种情况下,我们可以使用序列化程序。以下是完整的monty,其中包含一些样式修复:

models.py:

from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfoManager(models.Manager):
    def get_by_natural_key(self, username):
        return self.get(user__username=username)


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def natural_key(self):
        # Always return an iterable
        return [self.user.username]
from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def model_to_dict(self):
        model_string = '.'.join([self._meta.app_label,
                                self._meta.model_name.lower()])
        field_data = dict(
            user=self.user.username, name=self.name, phone=self.phone,
            role=self.role.id, i_can_put_anything_i_want_here=True
        )
        return {
            'model': model_string,
            'pk': self.pk,
            'fields': field_data,
        }
views.py:

from django.http import HttpResponse
from django.core import serializers
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
    return HttpResponse(data, content_type='application/json')
from django.http import JsonResponse
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    results = [m.model_to_dict() for m in clients]
    data = {
        'results': {
            'count': clients.count(),
            'data': results
        }
    }
    return JsonResponse(data)
这是另一种方法,你有更多的自由:

models.py:

from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfoManager(models.Manager):
    def get_by_natural_key(self, username):
        return self.get(user__username=username)


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def natural_key(self):
        # Always return an iterable
        return [self.user.username]
from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def model_to_dict(self):
        model_string = '.'.join([self._meta.app_label,
                                self._meta.model_name.lower()])
        field_data = dict(
            user=self.user.username, name=self.name, phone=self.phone,
            role=self.role.id, i_can_put_anything_i_want_here=True
        )
        return {
            'model': model_string,
            'pk': self.pk,
            'fields': field_data,
        }
views.py:

from django.http import HttpResponse
from django.core import serializers
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
    return HttpResponse(data, content_type='application/json')
from django.http import JsonResponse
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    results = [m.model_to_dict() for m in clients]
    data = {
        'results': {
            'count': clients.count(),
            'data': results
        }
    }
    return JsonResponse(data)

序列化程序用于创建装置:它创建可以导入数据库的模型表示。 如果需要不同的表示,请不要使用序列化程序。只需创建模型的dict表示,并将其提供给json.dumps(),或者直接提供给JSONResponse(如果您在视图中这样做的话)

但是在这种情况下,我们可以使用序列化程序。以下是完整的monty,其中包含一些样式修复:

models.py:

from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfoManager(models.Manager):
    def get_by_natural_key(self, username):
        return self.get(user__username=username)


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def natural_key(self):
        # Always return an iterable
        return [self.user.username]
from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def model_to_dict(self):
        model_string = '.'.join([self._meta.app_label,
                                self._meta.model_name.lower()])
        field_data = dict(
            user=self.user.username, name=self.name, phone=self.phone,
            role=self.role.id, i_can_put_anything_i_want_here=True
        )
        return {
            'model': model_string,
            'pk': self.pk,
            'fields': field_data,
        }
views.py:

from django.http import HttpResponse
from django.core import serializers
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
    return HttpResponse(data, content_type='application/json')
from django.http import JsonResponse
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    results = [m.model_to_dict() for m in clients]
    data = {
        'results': {
            'count': clients.count(),
            'data': results
        }
    }
    return JsonResponse(data)
这是另一种方法,你有更多的自由:

models.py:

from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfoManager(models.Manager):
    def get_by_natural_key(self, username):
        return self.get(user__username=username)


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def natural_key(self):
        # Always return an iterable
        return [self.user.username]
from django.db import models
from django.conf import settings


class Role(models.Model):
    role_type = models.IntegerField()  # type is a built-in keyword


class UserInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE, null=False)

    name = models.CharField(max_length=255, null=False)
    phone = models.IntegerField(default=0, null=False)
    role = models.ForeignKey(Role, default=3)

    def model_to_dict(self):
        model_string = '.'.join([self._meta.app_label,
                                self._meta.model_name.lower()])
        field_data = dict(
            user=self.user.username, name=self.name, phone=self.phone,
            role=self.role.id, i_can_put_anything_i_want_here=True
        )
        return {
            'model': model_string,
            'pk': self.pk,
            'fields': field_data,
        }
views.py:

from django.http import HttpResponse
from django.core import serializers
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    data = serializers.serialize('json', clients, use_natural_foreign_keys=True)
    return HttpResponse(data, content_type='application/json')
from django.http import JsonResponse
from .models import UserInfo


def list_clients(request):
    clients = UserInfo.objects.filter(role_id=3)
    results = [m.model_to_dict() for m in clients]
    data = {
        'results': {
            'count': clients.count(),
            'data': results
        }
    }
    return JsonResponse(data)

如果你在做复杂的序列化,你真的应该看看django rest framework。@DanielRoseman,是的,我想学习django rest framework,但现在我只能用django来解决这个问题如果你想使用序列化程序,那么这将是一个少于10行的代码解决方案如果你在做复杂的序列化,你真的应该看看django rest框架。@DanielRoseman,是的,我想学习django rest框架,但是现在我只能用Django来解决这个问题如果你想使用序列化程序,那么答案是不到10行代码的解决方案,但是仅仅为了一件非常简单的事情扩展用户模型似乎不是很好。这是有道理的,但我认为添加比更改好。你为什么要替换用户模型?不,使用DRF并不容易,而且您继承了“他们的方式或高方式”不必要的复杂性。如果您的最终目标是DRF提供的,那么就去实现它。仅仅使用bits将成为一场噩梦。我已经在文档中读到了这一点,但在我看来,修改django自己的元素并不方便,我正在使用heroku进行部署,安装的任何django 1.11都将不同于此,因此选择查看QuerySet。我不知道QuerySet可以实现这一点,如果您可以通过queryset实现这一点,这将是很好的。对于答案,但是仅仅为了一件非常简单的事情而扩展用户模型似乎不是很好。这是有道理的,但我认为添加优于更改。您为什么要替换用户模型?不,使用DRF并不容易,而且您继承了“他们的方式或高方式”不必要的复杂性。如果您的最终目标是DRF提供的,那么就去实现它。仅仅使用bits将成为一场噩梦。我已经在文档中读到了这一点,但在我看来,修改django自己的元素并不方便,我正在使用heroku进行部署,安装的任何django 1.11都将不同于此,因此选择查看QuerySet。我不知道QuerySet可以实现这一点,如果您可以通过queryset实现这一点,这将是很好的。