2017-10-04 3 views
0

新しいフィールドを作成するためにシリアライザで多くを使用しています。新しいフィールドを追加して既存のフィールドをそのまま残すために、更新を実装する必要があります。 Mycodeは以下の通りです。通過する間に、私はモデル名を与えることによって、ジャンゴの更新プログラムのサポートを使用しようとした多くのシリアライザの更新= Trueのみ作成はdjango APIでサポートされています

class AppSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Apps 
     fields = ('app_name', 'auth_token_id') 

    def create(self, validated_data): 
     if "auth_token_id" in self.context: 
      id1 = self.context["auth_token_id"] 
      instance = self.Meta.model(**validated_data) 
      user_id = id1 
      if user_id is not None: 
       instance.auth_token_id = user_id 
       instance.save() 
      return instance 

views.py

@api_view(['POST']) 
def add_apps(request): 
    data = request.data 
    auth_token = request.META.get('HTTP_AUTHTOKEN', '') 
    auth_tok = Device.objects.get(auth_token=auth_token) 
    a_id = auth_tok.id 
    serializer = AppSerializer(ThirdPartyApps, data=data, context={"auth_token_id": a_id}, many=True) 
    if serializer.is_valid(): 
     serializer.save() 
     content = collections.OrderedDict(
       [('status', True), ('message', "Third party apps are saved")]) 
     return Response(content, status=status.HTTP_200_OK) 
    else: 
     return Response(serializer.errors) 

models.py

class Device(models.Model): 
    device_id = models.CharField(max_length=200) 
    auth_token = models.CharField(max_length=100) 


class ThirdPartyApps(models.Model): 
    auth_token = models.ForeignKey(Device, on_delete=models.CASCADE) 
    app_name = models.CharField(max_length=100) 

serializers.py更新メソッドを呼び出すシリアライザに渡します。しかし、many = Trueの場合、更新はサポートされていません。createメソッドのみがサポートされています。これは、ListSerializerクラスを使用し、シリアライザで `.update()をオーバーライドすることを提案しています。私はそれを使用する方法を理解することができません。私はフィールドを更新したいだけです。

答えて

1

シリアライザのインス​​タンス化の引数は、インスタンスであり、Modelではありません。

serializer = AppSerializer(ThirdPartyApps, data=data, context={"auth_token_id": a_id}, many=True) 

ThirdPartyAppsを更新するインスタンスリストに置き換える必要があります。

また、複数の更新を処理する方法についてはdocumentationに従う必要があります。

+0

私はまったく同じ方法で試しましたが、many = Trueの場合は作成のみサポートされますが、更新はサポートされません。私はすでにドキュメンテーションのリンクを調べましたが、インスタンスシリアライザに明示的なidフィールドを追加する方法を理解できません。 –

+0

このエラーが発生しています - シリアライザmany = Trueは複数の更新をデフォルトでサポートしていません。更新に関しては、挿入と削除をどう扱うべきかは不明です。複数の更新をサポートする必要がある場合は、 'ListSerializer'クラスを使用して' .update() 'をオーバーライドして、ビヘイビアを正確に指定することができます。 –

+0

あなたは最初の質問でそのidのことを言及していない。マニュアルで説明されているように、更新機能を提供していませんでした。その質問を閉じて新しい質問を開始してください。 – Linovia

関連する問題