0
私はDRFが新しく、サーバーにPOSTリクエストを作成しようとしています。次のような複数の連絡先の詳細を送信するようにリクエストしてください。モデルの複数のインスタンスを使用してコレクションをシリアライズし、ポストリクエストを処理するためのより洗練された方法
{
"firstName":"Ryan",
"lastName":"Reynolds",
"numbers":[
1234567891, 9876543219
]
}
...またはそれに類するもの。
class Contact(models.Model):
firstName = models.CharField(max_length=50)
lastName = models.CharField(max_length=50)
class PhoneNumber(models.Model):
contact = models.ForeignKey(Contact, related_name='numbers', on_delete=models.CASCADE)
phoneNumber = models.CharField(max_length=10)
各コンタクトは、複数の電話番号を持つことができるので、私はこのように私のシリアライザを書いた:
私のモデルは次のようになり
class PhoneNumberSerializer(serializers.ModelSerializer):
class Meta:
model = PhoneNumber
fields = ['phoneNumber']
class ContactSerializer(serializers.ModelSerializer):
numbers = PhoneNumberSerializer(many=True)
class Meta:
model = Contact
fields = ('firstName', 'lastName', 'numbers')
def create(self, validated_data):
numbers_data = validated_data.pop('numbers')
contact = Contact.objects.create(**validated_data)
for number_data in numbers_data:
PhoneNumber.objects.create(contact=contact, **number_data)
return contact
私のviews.pyは、次のようになります。
class ContactView(APIView):
def get(self, request, format=None):
snippets = Contact.objects.all()
serializer = ContactSerializer(snippets, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = ContactSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
それはこの形式でJSONを受け入れ...
{
"firstName":"Ryan",
"lastName":"Reynolds",
"numbers":[
{
"phoneNumber":"6969666222"
},
{
"phoneNumber":"2342342312"
}
]
}
...これは私が気にしていたものではありません。
私の質問は、それがクリーンな形式で数値を受け入れることができますので、私はシリアライザ/ビューを書き換えることができます
- ですか?おそらく数字の配列か、それとも今のどのように機能しているのではなく、すべての数字を持つ辞書が少なくとも1つですか?
- 同じPOSTで複数の連絡先を送信したいとします。したがって、上で定義したように構造化された多数の応答の配列を作成し、それらをそれぞれDBの個々の要素として追加します。それをどうやってやりますか?更新されたコード
serializers.py
class PhoneNumberSerializer(serializers.ModelSerializer): class Meta: model = PhoneNumber fields = ['phoneNumber', 'contanct'] class ContactSerializer(serializers.ModelSerializer): numbers = PhoneNumberSerializer(many=True, read_only=True) class Meta: model = Contact fields = ('firstName', 'lastName', 'numbers') def create(self, validated_data): return Contact.objects.create(**validated_data)
views.py
class ContactView(APIView): def get(self, request, format=None): snippets = Contact.objects.all() serializer = ContactSerializer(snippets, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = ContactSerializer(data=request.data) if serializer.is_valid(): contact = serializer.save() numbers = request.data.get('numbers', '').split(',') new_data = [] for number in numbers: temp = {} temp['phoneNumber'] = number temp['contact'] = contact.id new_data.append(temp) serializer = PhoneNumberSerializer(data=request.data, many=True) if serializer.is_valid(): serializer.save() serializer = ContactSerializer(contact) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
それがスムーズに動作しますが、それでもあなたのプロジェクトでは、このソリューションを試してみましょうする必要があり、次の
感謝。それはまだ奇妙なことを期待しているようです - それは '数字'フィールドのための辞書の配列を望んでいます - 私は以前に持っている問題に似ています。 – Zalarox
まだエラーが発生した場合は、更新されたシリアライザ、ビュー、およびリクエストデータのサンプルと共にエラーをここに貼り付けてください。 –