2016-11-05 112 views
0

型號:Django的序列化程序REST API

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非常新,休息。

Seiralizer:

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__' 

我嘗試重寫根據問題的REST 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(廟廟= ** 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 

回答

0

你已經創造了他們,你正在使用ModelSerializer您Django的models實例,因此從rest_frameworksdocs

The ModelSerializer class provides a shortcut that lets you automatically create a Serializer class with fields that correspond to the Model fields.

The ModelSerializer class is the same as a regular Serializer class, except that:

  • It will automatically generate a set of fields for you, based on the model.

  • It will automatically generate validators for the serializer, such as unique_together validators

  • It includes simple default implementations of .create() and .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') 
+0

它表現出一定的錯誤,當我嘗試保存我的validated_data >>斯里alizerc.save() 回溯(最近通話最後一個): 在保存 self.instance = self.create(validated_data) 在創建 raise_errors_on_nested_writes( '創造',自主,validated_data) 在raise_errors_on_nested_writes CLASS_NAME =串行器。 __class ______ name__ AssertionError:'.create()'方法默認不支持可寫嵌套字段。 爲串行化程序「institute.serializers.TempleSerializer」編寫明確的'.create()'方法,或者在嵌套序列化程序字段中設置'read_only = True'。 – Aryan

+0

您是否閱讀過[ModelSerializer]的這一部分(http://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments),您沒有正確定義您的創建方法,已經嘗試過它,它適用於我,嘗試通過書 – PetarP

+0

如果我使用默認創建沒有重寫它是否工作? – Aryan

0
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 

這是一個完美ANS感謝大家..

相關問題