最初のステップ:カートに追加
1.カートは機能を持っている必要があります
- 項目がすでに存在する場合は、その後数に1を加えたショッピングカートを追加したり、商品を追加します
- セット複数のインタフェースそれぞれ、完了する:品物の数を減少させる、項目の数を増やし、削除アイテム
- 明らかに、第二の機能は、機能ミックスインされたインターフェイスを使用して達成することができるCRUD
2.最初に、私たちはモデルに追加する必要があるのShoppingCartの unique_together =(「ユーザー」、「製品」) NUMフィールド内だけ増減した後、ユーザーは、同じ項目のためのショッピングカートを追加することができますので、この時、
3.私たちはCreateModelMixinを呼び出した後ModelSerializerは、フロントが今してすでにポストと仮定すると、(ユーザー、商品)が存在すると仮定すると、それは内部のメソッドを作成するには、自動的に行わserializer.is_validので、エラーでこのステップは、我々私たちは、NUMの加算と減算の操作を実行することはできません
4.上記の考察に基づき、我々はしなければならないシリアライザを使用して動作NUM辞書の増加または減少を達成するように、このケースを操作する(ユーザ、物品)に柔軟に
外部キー・フィールドことに留意すべき商品は、ので、ここでシリアライザ使用するように PrimaryKeyRelatedFieldのフィールドを、プロパティクエリセットを追加することに注意しなければなりません
6.validated_dataユーザーフィールドがそこにありますか?
このような観点から、validated_dataユーザーフィールドが、ビデオはユーザー= self.context [「要求」]のみを取ることですなぜここでそれが明確ではありません。ユーザー
ここ7. [集計フォームまたはシリアライザ、実際には、彼らは唯一の2つの役割があります。
- (createModeMixinは、自動的にパラメータの正当性を検証するために、)(IS_VALID呼び出します、その後一貫して、フィールド名パラメータ名とシリアライザことを提供し、)パラメータ11のチェック以上前のポストの一つ
- バリデータの属性、局所フックなので、全体のフックは、より複雑なフィルタリングを達成することができます
- 第二に、戻りデータは、あなたがシリアライザを使用している場合、デフォルトはそれがModelSerializerであれば、すべてのフィールドのその定義に戻ることで、あなたはフィールドを返されるフィールドを指定することができます
8.コード
serializer.py
rest_frameworkの輸入シリアライザ から goods.models インポートグッズ から .models インポートのShoppingCart クラスShopCartSerializer(serializers.Serializer): #获取当前用户、并隐藏ユーザー字段 ユーザー= serializers.HiddenField( デフォルト = serializers.CurrentUserDefault() ) NUMS =シリアライザを。 IntegerFieldと(必要=真、MIN_VALUE = 1、ラベル= " 数量" 、 error_messages = { "必要な「:」後での番号を選択してください「」MIN_VALUE 「:」数の項目が1未満にはできません" )} #外部キーがPrimaryKeyRelatedFieldが必要な場合、およびオブジェクト属性がソースクエリセットを追加する必要性を示すために、 (財= serializers.PrimaryKeyRelatedFieldを必要=真、ラベル= 「製品」、 クエリセット = Goods.objects.all()) #の使用シリアライザ更新ロジックは、メソッドを作成して、特定のフィールドを達成するために書き換える必要があり、かつ手動で保存#のvalidated_dataデータ検証の後、前initial_dataチェックデータデフ 作成(自己、validated_data): #シリアライザレーンで、要求はself.contextの中にカプセル化 ユーザーself.context = [ " リクエスト" ] .user NUMS = validated_data [ " NUMS " ] 製品 = validated_data [ " 製品" ] #に追加2つの方法でカートは、一つの製品が既に存在している、第二製品が存在しないことで、そこに区別しなければならない 存在= ShoppingCart.objects.filter(ユーザーユーザー=、=商品の商品) IFが存在し: 存在 =は、[0]を存在しました existed.nums + = NUMSは (existed.save) 他: 存在していた = ShoppingCart.objects.create(** validated_data) リターンが存在していた クラス:メタ フィールド(= " NUMSを"、)
ビューセット
rest_frameworkのインポートビューセット から rest_framework.permissionsをインポートするにisAuthenticated から rest_framework_jwt.authentication インポートJSONWebTokenAuthentication から rest_framework.authenticationのインポートSessionAuthentication から utils.permissions インポートIsOwnerOrReadOnlyを から .serializers インポートShopCartSerializerを から .models インポートするShoppingCart クラスShoppingCartViewset(viewsets.ModelViewSet): ""を」 购物车功能 リスト: カートの詳細は取得 作成: カートに入れる :削除 削除カートの アップデート: アップデートカート "" " クエリセット = ShoppingCart.objects.all() serializer_class = ShopCartSerializer permission_classes = (にisAuthenticated、IsOwnerOrReadOnly) authentication_classes =(JSONWebTokenAuthentication、SessionAuthentication)
あなたは
#カートインターフェース() router.register(R ' shopcarts '、ShoppingCartViewset、ベース名= " shopcarts ")
9.テスト
第二:変更カートの数
1.プロセスにシリアライザPOSTとPUTリクエストを使用して、そして自分自身の書き換え更新を作成する必要、または次のように与えられました
2.我々は、IDの商品のための阿仁のID shopcartsインタフェースを提供したい、ID番号shopcartsは、自分自身を形成するのではなく、
lookup_field = " goods_id "
---事実ではなく、その中国での紳士、その内部のガバナンスは、外側死亡した チャン・ ----