我有一個API需要返回一個QuestionQueue及其關聯的Question對象作爲列表。我得到它很好地工作,它會返回我想要的數據:Django rest_framework 3.22多個更新創建對象而不是更新
class QuestionQueueSerializer(serializers.ModelSerializer):
questions = QuestionSerializer(
many=True,
source='question_set',
required=False,
)
我無法獲取更新以使用此API。我正在關注多個寫入的documentation。我有我自己定製的ListSerializer
實例,名爲QuestionListSerializer
。下面是我如何使用它內部的QuestionQueueSerializer
:
def update(self, instance, validated_data):
questions_data = validated_data.pop('question_set')
super(QuestionQueueSerializer, self).update(instance, validated_data)
question_list_serializer = QuestionSerializer(
instance=instance.question_set.all(),
data=questions_data,
many=True
)
if question_list_serializer.is_valid():
question_list_serializer.save(
company_id=instance.company_id,
question_queue_id=instance.id
)
return instance
這裏的上QuestionListSerializer
的更新方法,我已經在我的QuestionSerializer
設置爲list_serializer_class
:
def update(self, instance, validated_data):
questions_by_id = {_question.id: _question for _question in instance}
# Perform creations and updates.
ret = []
for question_data in validated_data:
question = None
if 'id' in question_data:
question = questions_by_id.get(question_data['id'], None)
if not question:
ret.append(self.child.create(question_data))
else:
ret.append(self.child.update(question, question_data))
question_ids_to_delete = set(questions_by_id.keys()) - {_q.id for _q in ret}
Question.objects.filter(id__in=question_ids_to_delete).update(delete_ts=timezone.now())
return ret
的問題是,當我QuestionListSerializer
「 update
方法被調用,validated_data
不包含問題的ID。他們都看起來像是新創造的。 request.data
中的問題都有ID。他們在一路上被剝離出來。我不知道如何讓這個工作。
我試圖將此代碼複製到我的代碼庫,但我無法讓它工作。我左右絞盡腦汁,無濟於事。在'to_internal_value'的一些調用中,'context'不包含'view'。如果根是我列表的一個實例,它不包含'fields'。我準備放棄rest_framework,因爲要完成我所需要的任務非常困難。 –
如果root是一個列表,它將不包含任何字段。 'root.child.field'將存在。 'ListSerializer'不包含任何字段。所有字段都回退到子序列化程序字段。 – miki725