RESTful APIを使用して独自の製品を作成できるようにします。この目的のために、私はListCreateAPIViewを継承するビューを作成しました。問題は、所有している製品のみを作成する必要があるため、製品モデルのインスタンスが作成されたときに、所有者フィールドが認証されたユーザーに対応したかったということです。Django Rest Frameworkはシリアル化する前のデータを更新します
ここに私の製品モデルは
class Product(models.Model):
owner = models.ForeignKey(User)
name = models.CharField(max_length=30)
です明らかに私のシリアライザは、次のとおりです。
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = models.Product
と私の見解:
class ProductView(generics.ListCreateAPIView):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
#serializer.initial_data['owners'] = models.Person.objects.get(user__email=request.user).user_id
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
あなたが見ることができるように、私は "initial_data" を修正しようとしましたそれは変更不可能なQueryDictです。もう1つの選択肢は、それをPythonの辞書に変換して「所有者」の値を追加することですが、その際にすべての値をリスト(つまり{'name':[MyName ']})として取得します。問題を解決するための醜い方法、私はそれがより簡単な解決策でなければならないと思う。
それに伴う問題は、perform_create機能がIS_VALID()実行後に呼び出されることで、perform_createが実行される前に作成する機能は、例外が発生しますので、シリアライザは、所有者フィールドなしで有効ではありません。 –
シリアライザで 'owner'フィールドを' read_only'と定義することができます。その後、直列化解除時には必要なくなりますが、直列化時には必ず出力に戻されます。 –
非常に便利で、とてもクールです。ありがとう! –