【问题标题】:Django rest api in serializer序列化程序中的 Django rest api
【发布时间】:2016-11-05 03:55:50
【问题描述】:

型号:

class Timings(models.Model):
    Timings_to = models.TimeField(blank=True)
    Timings_from = models.TimeField(blank=True)

    def __str__(self):
        return str(self.Timings_to) + '' + str(self.Timings_from)

class Temple(models.Model):
    history = models.TextField(blank=False)
    timings = models.ManyToManyField(Timings, blank=False, related_name='temple_timing')
    establishment = models.CharField(max_length=20, choices=ESTABLISHMENT_CHOICE,
                                     blank=True, default=None
                                     )

我的问题如何为这些类编写序列化程序。我在 django 和休息中很新。

序列化器:

class TimingsCreateUpdateSerializer(serializers.ModelSerializer):
    """ Timing Serializer for create """
    Timings_to = serializers.TimeField(format="%I:%M%p")
    Timings_from = serializers.TimeField(format="%I:%M%p")

    class Meta:
        model = Timings
        fields = ('id', 'Timings_to', 'Timings_from',)
        read_only = ('id',)

class TempleSerializer(serializers.ModelSerializer):
    timings = TimingsCreateUpdateSerializer(many=True)

    class Meta:
        model = Temple
        fields = '__all__'

我尝试根据 restfull api 的文档覆盖创建方法。但它不起作用,请告诉我为这个模型编写序列化程序类的正确方法。

def create(self, validated_data):
    timings_data = validated_data.pop('timings')
    temple = Temple.objects.create(**validated_data)
    for time_data in timings_data:
        Timings.objects.create(temple=temple, **time_data)
    return temple 

创建了寺庙对象,但在“Timings.objects.create(temple=temple, **time_data)”中显示此错误

>>> serializer = TempleSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\aryan\prabhat\anakonda\envs\sarvam\lib\site-packages\rest_framework\serializers.py", line 192, in save
    self.instance = self.create(validated_data)
  File "C:\Users\aryan\prabhat\sarvam_src\institute\serializers.py", line 103, in create
    Timings.objects.create(temple=temple, **time_data)
  File "C:\Users\aryan\prabhat\anakonda\envs\sarvam\lib\site-packages\django\db\models\manager.py", line 122, in manager
_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\aryan\prabhat\anakonda\envs\sarvam\lib\site-packages\django\db\models\query.py", line 399, in create
    obj = self.model(**kwargs)
  File "C:\Users\aryan\prabhat\anakonda\envs\sarvam\lib\site-packages\django\db\models\base.py", line 451, in __init__
    raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'temple' is an invalid keyword argument for this function

【问题讨论】:

    标签: django python-3.x django-rest-framework django-serializer


    【解决方案1】:

    你已经创建了它们,你正在为你的 Django models 实例使用ModelSerializer,所以来自rest_frameworks docs

    ModelSerializer 类提供了一个快捷方式,可让您 自动创建一个序列化器类,其字段对应于 模型字段。

    ModelSerializer 类与常规的 Serializer 类相同, 除了:

    • 它会根据模型自动为您生成一组字段。

    • 它会自动为序列化器生成验证器,例如unique_together验证器

    • 它包括 .create() 和 .update() 的简单默认实现。

    我已经测试了您的serializers 并且它们已创建,您只需不需要为它们使用def create 方法,因为它在您使用ModelSerializer 类时默认实现,只需进入./manage.py shell 并像检查它们一样所以:

    >>> from test_rest_create_method.serializers import TimingsCreateUpdateSerializer
    >>> serializer = TimingsCreateUpdateSerializer()
    >>> print(repr(serializer))
    TimingsCreateUpdateSerializer():
        id = IntegerField(label='ID', read_only=True)
        Timings_to = TimeField(format='%I:%M%p')
        Timings_from = TimeField(format='%I:%M%p')
    

    另一个是

    from test_rest_create_method.serializers import TempleSerializer
    >>> serializer_temple = TempleSerializer()
    >>> print(repr(serializer_temple))
    TempleSerializer():
        history = CharField(style={'base_template': 'textarea.html'})
        timings = TimingsCreateUpdateSerializer(many=True):
            id = IntegerField(label='ID', read_only=True)
            Timings_to = TimeField(format='%I:%M%p')
            Timings_from = TimeField(format='%I:%M%p')
    

    【讨论】:

    • 当我尝试保存我的验证数据时显示一些错误 >>serializerc.save() 回溯(最近一次调用最后一次):在保存 self.instance = self.create(validated_data) in create raise_errors_on_nested_writes( raise_errors_on_nested_writes 中的“create”、self、validated_data) class_name=serializer.__class__.__name__ AssertionError: .create() 方法默认不支持可写嵌套字段。为序列化器institute.serializers.TempleSerializer 写一个显式的.create() 方法,或者在嵌套的序列化器字段上设置read_only=True
    • 你读过ModelSerializer的这一部分吗,你没有正确定义你的create方法,我试过了,它对我有用,试试看书
    • 如果我使用默认创建而不覆盖它是否有效?
    【解决方案2】:
    def create(self, validated_data):
        timings_data = validated_data.pop('timings')
        temple = Temple.objects.create(**validated_data)
    
        for time_data in timings_data:
            obj2 = Timings.objects.create(**time_data)
            temple.timings.add(obj2)
        return temple
    

    这是完美的答案谢谢大家..

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多