私は親子モデル/シリアライザ/ビューセットのペアました - ツールとToolInput:ジャンゴRESTフレームワーク:ネストされたシリアライザにコンテキストを渡す
models.py:
class Tool(models.Model):
id = models.CharField(max_length=10000, primary_key=True, default=uuid.uuid4, editable=False)
base_command = jsonfield.JSONField(verbose_name="baseCommand")
class ToolInput(models.Model):
tool = models.ForeignKey(Tool, related_name="inputs", on_delete=models.CASCADE)
id = models.CharField(max_length=10000, primary_key=True)
label = models.CharField(max_length=10000, null=True, blank=True)
description = models.CharField(max_length=10000, null=True, blank=True)
type = jsonfield.JSONField()
serializers.py
class ToolSerializer(WritableNestedModelSerializerMixin,
serializers.HyperlinkedModelSerializer):
id = serializers.CharField()
inputs = ToolInputSerializer(many=True)
baseCommand = serializers.JSONField(source="base_command")
class Meta:
model = Tool
fields = ('id', 'inputs', 'baseCommand')
class ToolInputSerializer(WritableNestedModelSerializerMixin,
serializers.HyperlinkedModelSerializer):
class Meta:
model = ToolInput
fields = ('id', 'label', 'description', 'type')
を
views.py:
class ToolViewSet(viewsets.ModelViewSet):
queryset = Tool.objects.all()
lookup_field = 'id'
serializer_class = ToolSerializer
class ToolInputViewSet(viewsets.ModelViewSet):
lookup_field = 'id'
serializer_class = ToolInputSerializer
def get_queryset(self):
tool_id = self.kwargs['tool_id']
return ToolInput.objects.filter(tool_id=tool_id)
def get_serializer_context(self):
context = super(ToolInputViewSet, self).get_serializer_context()
context["tool"] = Tool.objects.get(id=self.kwargs['tool_id'])
return context
ご覧のとおり、ToolInputViewSet
のスタンドアロンシリアライザとして、ToolViewSet
のネストシリアライザとして、ToolInputSerializer
を使用します。 ToolInputSerializer
がToolViewSet
にネストされたシリアライザとして使用する場合
、それは何らかの形で自動的にtool
引数の値を受け取り、ToolInput
モデルのtool
フィールドに割り当てます(ちなみに、私はそれはアーキテクチャの観点から、完全に間違っ行動だと感じます - のようなフィールドはありません。ToolInputSerializer
にあり、DRFはそれぞれのモデルのフィールドを満たしています。Field Does Not Exist
エラーIMOで救済され、少なくともシリアライザでは書き込み専用フィールドtool
が必要です。
しかし、私はToolInputViewSet
で、スタンドアロンのシリアライザとして使用する場合、私はkwargsからでToolInputViewSet
で受信しtool_id
urlパラメータによって決定Tool
インスタンスにToolInput
モデルのtool
フィールド、、の値を割り当てます。
ToolInputViewSet.get_serializer_context()
メソッドをオーバーライドするシリアライザコンテキストでそのフィールドの値を渡そうとしていますが、機能しません。どのようにそれを正しく行うには?
追記:私はモデルシリアライザ・フィールド・ビューアーキテクチャの層を貫通DRFのコンテキスト取り扱いの乱雑と矛盾し、不均一なオートマジックのかなり疲れています。それはもっと明白でカスタマイズ可能である必要があります。