标签: django-serializer

使用Model在Django中创建JSON响应

我在这里有一些问题.我试图返回由消息和模型实例组成的JSON响应:

   class MachineModel(models.Model):
       name = models.CharField(max_length=64, blank=False)
       description = models.CharField(max_length=64, blank=False)
       manufacturer = models.ForeignKey(Manufacturer)
       added_by = models.ForeignKey(User, related_name='%(app_label)s_%(class)s_added_by')
       creation_date = models.DateTimeField(auto_now_add=True)
       last_modified = models.DateTimeField(auto_now=True)

    machine_model_model = form.save(commit=False)
    r_user = request.user.userprofile
    machine_model_model.manufacturer_id = manuf_id
    machine_model_model.added_by_id = request.user.id
    machine_model_model.save()
    alert_message = " The'%s' model " % machine_model_model.name
    alert_message += ("for '%s' " % machine_model_model.manufacturer)
    alert_message += "was was successfully created!"
    test = simplejson.dumps(list(machine_model_model))
    data = [{'message': alert_message, 'model': test}]
    response = JSONResponse(data, {}, 'application/json')


class JSONResponse(HttpResponse):
"""JSON response class."""
    def __init__(self, obj='', …
Run Code Online (Sandbox Code Playgroud)

python django json django-models django-serializer

6
推荐指数
2
解决办法
2万
查看次数

Django Serializer AttributeError:'unicode'对象没有属性'isoformat'

我正在尝试序列化(自定义)Django用户模型的实例,如下所示:

在models.py中:

Class Employee(User):
    company = models.ForeignKey('Company')
    additionalField1
    additionalField2
    etc....
Run Code Online (Sandbox Code Playgroud)

在上面的Employee模型中,除了从User模型继承的属性之外,我还使用以下模型字段类型:CharField(),NullBooleanField(),IntegerField(),DateField(),DecimalField()

有问题的代码:

employee = Employee()
(snip large amounts of code that sets various attributes for employee)
serializers.serialize("json", [employee, ])
Run Code Online (Sandbox Code Playgroud)

(我已经安装了WadOfStuff的Django完整的串行器插件,顺便说一句,重要的是 - 但在这种情况下我认为它应该默认为标准的Django序列化器,因为在这种情况下我没有使用任何完整的串行器的功能)

在尝试序列化之前,员工__dict__(有几个关键字段是匿名的):

{'status': u'Act', 'last_name': u'Doe', 'payFrequency': u'Mo', '_state':
 <django.db.models.base.ModelState object at 0x15be890>, 'sex': u'M', 'user_ptr_id': 
None, 'is_staff': False, 'isRegistered': False, 'hireDate': u'2012-08-01', 'id': None, 
'date_joined': datetime.datetime(2012, 10, 25, 2, 39, 22, 793015, tzinfo=<UTC>), 
'city': u'San Francisco', 'first_name': u'John', 'zip': u'94114', u'employmentType': 
u'FT', 'company_id': 4, 'compType': u'S', 'is_superuser': False, …
Run Code Online (Sandbox Code Playgroud)

django django-serializer

6
推荐指数
1
解决办法
7978
查看次数

将具有相关对象的模型对象序列化为JSON

我有一个Person存储人员详细信息的模型.

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)    
    birthdate = models.DateField()
Run Code Online (Sandbox Code Playgroud)

我也有模特PersonLogs来存储人的活动日志.

class PersonLogs(models.Model):
    person = models.ForeignKey(Person)
    time = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

我正在使用Django Serializer将Person对象作为响应返回JSON格式.

from django.core import serializers
data = serializers.serialize("json", Person.objects.all())
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "model": "store.person",
    "fields": {
        "first_name": "Douglas",
        "last_name": "Adams",
        "birth_date": "1952-03-11",
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想回到PersonLogsJSON回复.

预期产出:

{
    "model": "store.person",
    "fields": {
        "first_name": "Douglas",
        "last_name": "Adams",
        "birth_date": "1952-03-11",
        "personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]]
    }
}
Run Code Online (Sandbox Code Playgroud)

我查看了官方文档,但我没有得到任何帮助.链接

django django-serializer

6
推荐指数
1
解决办法
2864
查看次数

DjangoRestFramework - 如何使用模型序列化程序访问 OneToOneField 反向关系的其他字段?

我正在使用默认的 User 模型,并且还使用 UserExtended 模型对其进行了扩展:

class Country(models.Model):
    countryName = models.CharField(max_length=50, unique=True)
    countryCode = models.CharField(max_length=10, unique=True)

class UserExtended(models.Model):
    user = models.OneToOneField(User, related_name="userextended")
    country = models.ForeignKey(Country)
Run Code Online (Sandbox Code Playgroud)

我正在尝试遵循此处记录的内容:http : //www.django-rest-framework.org/api-guide/relations/#reverse-relations

这是我的 UserSerializer:

class UserSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
            super(UserSerializer, self).__init__(*args, **kwargs) # call the super() 
            for field in self.fields: # iterate over the serializer fields
                self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message

    class Meta:
        model = User
        fields = ('username', 'password', 'email', 'userextended')

        extra_kwargs = {
                    'password': …
Run Code Online (Sandbox Code Playgroud)

django django-models django-serializer django-rest-framework

6
推荐指数
1
解决办法
1695
查看次数

如何在 django API 中一次更新多个记录(批量更新)

我需要在一个请求categories中多次更新Article

ArticleViewSet我有:

def get_serializer_class(self):
    if self.action in ['partial_update', 'update']:
        return ArticlePostSerializer
    return ArticleSerializer
Run Code Online (Sandbox Code Playgroud)

所以ArticlePostSerializer需要改变。

这是我的序列化程序代码:

class ArticleShortCategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = 'id', 'name'


class ArticleSerializer(serializers.ModelSerializer):
    categories = serializers.SerializerMethodField()

    def get_categories(self, obj):
        return ArticleShortCategorySerializer(obj.categories, many=True).data

    class Meta:
        model = Article
        read_only_fields = 'id'
        fields = ('categories', 'text') + read_only_fields


class ArticlePostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = 'id', 'categories', 'text'
Run Code Online (Sandbox Code Playgroud)

我尝试添加:

class ArticlePostListSerializer(serializers.ListSerializer):
Run Code Online (Sandbox Code Playgroud)

class Meta:
    list_serializer_class = ArticlePostListSerializer …
Run Code Online (Sandbox Code Playgroud)

python django django-serializer

6
推荐指数
1
解决办法
6619
查看次数

序列化器 - Django REST Framework - 序列化器字段可能命名不正确,并且与“str”实例上的任何属性或键不匹配

我想像示例一样填充图表:https://www.chartjs.org/docs/latest/charts/bar.html

我收到此错误:

AttributeError at /timesheet/json-month/
Got AttributeError when attempting to get a value for field `working_hour` on serializer `TimesheetSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `str` instance.
Original exception text was: 'str' object has no attribute 'working_hour'.
Run Code Online (Sandbox Code Playgroud)

有了这个模型:

class Timesheet(models.Model):
    owner = models.ForeignKey(User, on_delete = models.CASCADE)
    title = models.CharField(max_length = 64, verbose_name = _("Title"))
    date = models.DateField(default=datetime.datetime.now())
    working_hour = models.FloatField(verbose_name = _("Working time"))
    week = models.IntegerField(verbose_name = "working week") …
Run Code Online (Sandbox Code Playgroud)

django serialization django-serializer

6
推荐指数
1
解决办法
2万
查看次数

Django Rest Framework - 创建和更新父子关系

我正在尝试使用 Django Rest Framework 序列化程序为我的前端创建 API,以在商店中创建/更新和删除文章。这些文章可以有多个价格(取决于时间)。因此,商品(一)与价格(多)之间存在一对多关系。我已在中定义了这一点models.py

\n\n
class Article(models.Model):\n    article_id = models.AutoField(primary_key=True, verbose_name="Article ID")\n    article_name = models.CharField(max_length=250, verbose_name="Name")\n    article_order = models.IntegerField(verbose_name="Order")\n\nclass Price(models.Model):\n    price_id = models.AutoField(primary_key=True, verbose_name="Price ID")\n    article_id = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="Article ID", related_name="Prices")\n    price_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="Price")\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的serializers.py 文件如下所示:

\n\n
from rest_framework import serializers\nfrom .models import *\n\nclass PriceSerializer(serializers.ModelSerializer):\n\n    class Meta:\n        model = Price\n        fields = (\'price_price\',)\n\nclass ArticleSerializer(serializers.ModelSerializer):\n\n    Prices = PriceSerializer(many=True)\n\n    def create(self, validated_data):\n        prices_data = validated_data.pop(\'Prices\')\n        article = Article.objects.create(**validated_data)\n        for price_data in prices_data:\n            Price.objects.create(article_id=article, **price_data)\n …
Run Code Online (Sandbox Code Playgroud)

python django django-serializer django-rest-framework

6
推荐指数
1
解决办法
4750
查看次数

如何为“列表”(玩家/)和“详细信息”(玩家/{id})获得不同的结果?

这是情况。我的 Django REST API 上有一个列表:/playerslist/

它返回给我一个像这样的球员名单:

http://pastebin.com/JYA39gHT

这正是我目前想要的。但现在,我需要这个:

Going for/playerslist/1/为我提供了不同的玩家编号 1 信息。这里的列表仅用于列出具有基本信息的玩家。但是我需要玩家的详细视图,包含来自其他模型的信息并具有不同的序列化,这一定是一个基本问题,但由于我对 Django 和 Python 总体而言是全新的,我必须误解一些东西。

这是我的视图集:

class PlayersListViewSet(viewsets.ModelViewSet):
    queryset = Player.objects.all()
    serializer_class = PlayersListSerializer
    http_method_names = ['get', 'post']
    pagination_class = None
    filter_backends = [filters.OrderingFilter]
    ordering_fields = ['name']

   def get_queryset(self):
      queryset = Player.objects.all()
      team_id = self.request.query_params.get('team', None)

      if team_id:
          try:
              queryset = queryset.filter(team=team_id)
          except ValueError:
              raise exceptions.ParseError()
       return queryset
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我必须使用@detail_route类似的东西playerslist/1/detail吗?我已经尝试过,但 DRF 的文档只显示了一个示例,对我来说根本不清楚。

python django django-queryset django-serializer django-rest-framework

5
推荐指数
1
解决办法
2155
查看次数

Django Rest Framework Serializer charfield 在提供源时不会更新

我有一个带有选择 charfield 的模型字段

class Vehicle(models.Model):
    name = models.CharField(max_length=100)

    STATUS_CHOICES = (
        ("N", "New"),
        ("U", "Used"),
        ("P", "Just Purchased")
    )
    status = models.CharField(max_length=3, choices=STATUS_CHOICES)
Run Code Online (Sandbox Code Playgroud)

序列化器类也有用于状态的字符字段,但带有source显示可读值的参数

class VehicleSerializer(ModelSerializer):
    status = serializers.CharField(source='get_status_display')

    class Meta:
        model = Vehicle
Run Code Online (Sandbox Code Playgroud)

当我尝试通过带有数据的补丁请求更新车辆时{'status': "U"},没有执行更新。但是,当我source从序列化程序状态字段中删除时会发生更新。必须提供来源才能在 Web 视图中显示正确的值。

我知道将序列化程序中的状态名称更改为其他名称并在模板中使用该名称的选项。还有一个选项可以覆盖序列化程序中的更新方法,但是我的问题是源代码在做什么来阻止更新?

django django-serializer django-rest-framework

5
推荐指数
1
解决办法
962
查看次数

在序列化器中使用验证响应对字段长度约束进行建模

我正在使用序列化器中的数据验证来验证 django 的其余框架中的请求中的数据。我需要在单个响应中发送所有错误消息。

在发送太长的字符串时,我收到错误:

django.db.utils.DataError: value too long for type character varying(3)
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我将字符字段的最大长度定义为 3(理论上需要的最大长度)。

我在序列化器中添加了验证以捕获包含太多字符的请求:

验证器.py

class CustomUserValidators():

    errors_to_return = {}
    def val_role(self, role):
            if len(role) > 3:
                self.errors_to_return["role_length"] = "Ensure this field has no more than 3 characters."
Run Code Online (Sandbox Code Playgroud)

序列化器.py

from Sea.validators import CustomUserValidators
class LagoonUserCreateSerializer(UserCreateSerializer, CustomUserValidators):
    class Meta:
        model = User
        fields = ('id', 'username', 'role',)


    def validate(self, attrs):
        self.val_role(attrs['role'])

        if len(self.errors_to_return) > 0:
            raise serializers.ValidationError(self.errors_to_return)

        return attrs
Run Code Online (Sandbox Code Playgroud)

模型.py

class SeaUser(AbstractUser):
    ...
    role = models.CharField(_('Role'), max_length=3)
Run Code Online (Sandbox Code Playgroud)

但请求仍然返回错误(value too …

python django django-models django-serializer django-rest-framework

5
推荐指数
1
解决办法
6526
查看次数