2016-07-03 11 views
2

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 ']})として取得します。問題を解決するための醜い方法、私はそれがより簡単な解決策でなければならないと思う。

答えて

4

perform_create()を上書きして、現在のユーザーをownerとして渡すことができます。その後、Productインスタンスが作成されると、ownerフィールドは現在のユーザー値で保存されます。

class ProductView(generics.ListCreateAPIView): 
    queryset = models.Product.objects.all() 
    serializer_class = serializers.ProductSerializer 
    permission_classes = (IsAuthenticatedOrReadOnly,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) # pass the current user as the 'owner' 

また、あなたはread_onlyとしてあなたシリアライザでownerフィールドを定義する必要があります。次に、デシリアライズ時にフィールドは必要ありません。しかし、このフィールドはシリアル化の出力に含まれます。

class ProductSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = models.Product 
     extra_kwargs = {'owner': {'read_only':True}} # set 'owner' as read-only field 
+1

それに伴う問題は、perform_create機能がIS_VALID()実行後に呼び出されることで、perform_createが実行される前に作成する機能は、例外が発生しますので、シリアライザは、所有者フィールドなしで有効ではありません。 –

+0

シリアライザで 'owner'フィールドを' read_only'と定義することができます。その後、直列化解除時には必要なくなりますが、直列化時には必ず出力に戻されます。 –

+1

非常に便利で、とてもクールです。ありがとう! –

0

以下の簡単な解決策です。 ownerはGET/POST/PUTなどのリクエストでは表示されませんが、現在の認証済みのユーザーには自動的に割り当てられます。

from rest_framework.serializers import (CurrentUserDefault, HiddenField, 
             ModelSerializer) 

class ProductSerializer(ModelSerializer): 
    owner = HiddenField(default=CurrentUserDefault()) 

    class Meta: 
     model = models.Product 
関連する問題