Django はインターフェイス自動化プラットフォーム (13) インターフェイス モジュールを実装します。 インターフェイス シリアライザーとビュー [継続的に更新されます]

関連記事:

Django がインターフェース自動化プラットフォームを実装 (12) カスタム関数モジュール DebugTalks シリアライザーとビュー [継続的に更新]_Do テストニャーソースブログ - CSDN ブログ

この章はプロジェクトの内訳です。この章の内容を参照する場合は、プロジェクト コード全体と併せて参照する必要があります。

Python django vue httprunner はインターフェイス自動化プラットフォーム (最終バージョン) を実装します

1. インターフェースの背景と関連インターフェース

リクエストメソッド URI 対応するアクション 実現機能
得る /インターフェース/ 。リスト() インターフェースリストを問い合わせる
役職 /インターフェース/ 。作成() データを作成する
得る /インターフェース/{id}/ .retrieve() インターフェースの詳細データを取得する
置く /インターフェース/{id}/ アップデート() データ内のすべてのフィールドを更新する
パッチ /インターフェース/{id}/ .partial_update() データの一部のフィールドを更新する
消去 /インターフェース/{id}/ 。破壊() データの一部を削除する
得る /インターフェース/{id}/configs/ インターフェースの構成情報を問い合わせる
役職 /インターフェース/{id}/run/ 特定のインターフェースですべてのケースを実行する
得る /インターフェース/{id}/testcases/ インターフェースの下のケースリストをクエリします。

プロジェクトの下には複数のインターフェースが存在します。

インターフェースには複数のケースがあります。

1.1 クエリインターフェース一覧

得る /インターフェース/ 。リスト() インターフェースリストを問い合わせる

 インターフェイス リスト。すべてのプロジェクトのインターフェイスがこのリストに含まれます。

1.2 インターフェースの作成 インターフェース

役職 /インターフェース/ 。作成() データを作成する

1.3 インターフェイスの編集と更新 インターフェイス

置く /インターフェース/{id}/ アップデート() データ内のすべてのフィールドを更新する

 

 

2番目に、モデルクラスモデル

モデル.py

from django.db import models

from utils.base_models import BaseModel


class Interfaces(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('接口名称', max_length=200, unique=True, help_text='接口名称')
    project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
                                related_name='interfaces', help_text='所属项目')
    tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
    desc = models.CharField('简要描述', max_length=200, null=True, blank=True, help_text='简要描述')

    class Meta:
        db_table = 'tb_interfaces'
        verbose_name = '接口信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

このコードは、インターフェイス情報を表す Interfaces という Django モデル クラスです。

このモデル クラスは BaseModel から継承し、次のフィールドを定義します。

  • id: 自動的に生成される自動インクリメントされた主キー。
  • name: インターフェイス名。最大長 200 文字の文字フィールドであり、一意である必要があります。
  • project: カスケード削除を使用して、Projects という名前の別のモデル クラスに関連付けられた外部キー フィールド。
  • tester: tester、最大長 50 の文字フィールドです。
  • desc: 簡単な説明。これはオプションの文字フィールドで、最大長は 200 で、空にすることができます。

モデル クラスの Meta 内部クラスでは、いくつかのメタデータが定義されています。

  • db_table: データベース テーブルの名前を「tb_interfaces」として指定します。
  • verbose_name: モデル クラスの読み取り可能な名前は「インターフェイス情報」で、管理インターフェイスに表示するために使用されます。
  • verbose_name_plural: モデル クラスの可読複数名は、verbose_name と同じです。
  • 順序付け: デフォルトの並べ替え方法を ID による昇順として定義します。

最後に、モデル クラスは、インターフェイスの名前 (名前フィールドの値) をインスタンスの文字列表現として返す __str__() メソッドを定義します。これは、オブジェクトのデバッグや表示に便利です。

このモデル クラスは、インターフェイスの名前、インターフェイスが属するプロジェクト、テスター、簡単な説明などのフィールドを含むインターフェイス情報を表します。

3. シリアライザ


from rest_framework import serializers

from .models import Interfaces
from projects.models import Projects



class InterfaceModelSerilizer(serializers.ModelSerializer):
    project = serializers.StringRelatedField(label='所属项目名称', help_text='所属项目名称')
    project_id = serializers.PrimaryKeyRelatedField(label='所属项目id', help_text='所属项目id',
                                                    queryset=Projects.objects.all())

    class Meta:
        model = Interfaces
        exclude = ('update_datetime',)
        extra_kwargs = {
            "create_datetime": {
                "read_only": True,
                "format": "%Y年%m月%d日 %H:%M:%S"
            }
        }

    def to_internal_value(self, data):
        result = super().to_internal_value(data)
        result['project'] = result.pop('project_id')
        return result

 

これは、インターフェイス情報をシリアル化および逆シリアル化するために使用される InterfaceModelSerializer と呼ばれる Django REST フレームワーク シリアライザーです。

シリアライザーは ModelSerializer を継承し、次のフィールドとメタデータを定義します。

  • project:serializers.StringManyField を通じて、関連付けられたプロジェクト オブジェクトが文字列表現にシリアル化され、ラベルは「属するプロジェクトの名前」になります。
  • project_id: 関連付けられたプロジェクト オブジェクトを、serializers.PrimaryKeyManyField を通じて主キー ID にシリアル化します。ラベルは「プロジェクト ID」、クエリ セットは Projects.objects.all() です。

モデル クラスには project_id フィールドはなく、project フィールドのみがあります。プロジェクト フィールドに対して取得された値は、ユーザーによって渡されるのではなく、テーブル情報に基づいてクエリされます。したがって、シリアライザーのプロジェクト フィールドの対応する値を手動で追加する必要があります。

Meta 内部クラスでは、次のプロパティが定義されています。

  • モデル: シリアライザーに対応するモデルがインターフェイスであることを指定します。
  • exclude: シリアル化および逆シリアル化する必要のないフィールドを除外します。ここでは、update_datetime フィールドが除外されます。
  • extra_kwargs: 追加のフィールド パラメーターを定義するために使用されます。ここでは、create_datetime フィールドを読み取り専用に設定し、日付と時刻の形式を「%Y Year%mMonth%dDay%H:%M:%S」として指定します。

さらに、シリアライザーは to_internal_value() メソッドも書き換え、親クラスのメソッドを呼び出して逆シリアル化されたデータを取得し、モデル クラスの名前と一致するように project_id フィールドの値をプロジェクト フィールドに割り当てます。

シリアライザーはシリアル化および逆シリアル化インターフェイス情報を実装し、追加のフィールド パラメーター、データ変換、その他の機能を提供します。

to_internal_value() メソッドを書き直す必要がある理由は次のとおりです。

​​​​​​​result['project'] = result.pop('project_id')

モデル クラスには project_id フィールドはなく、project フィールドのみがあるためです。

class Interfaces(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('接口名称', max_length=200, unique=True, help_text='接口名称')
    project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
                                related_name='interfaces', help_text='所属项目')
    tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
    desc = models.CharField('简要描述', max_length=200, null=True, blank=True, help_text='简要描述')

project_id フィールドは次のものから取得されます。

3.1 拡張: to_internal_value() メソッドを書き換える

 3.1.1. ModelSerializer クラスの紹介:

5、DRFモデルシリアライザーModelSerializer

3.1.2 to_internal_value()独自メソッド

継承関係:

 

to_internal_value() メソッドをオーバーライドします。to_internal_value() は Serializer クラスから継承されます。

ソースコード:

    def to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """
        if not isinstance(data, Mapping):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__
            )
            raise ValidationError({
                api_settings.NON_FIELD_ERRORS_KEY: [message]
            }, code='invalid')

        ret = OrderedDict()
        errors = OrderedDict()
        fields = self._writable_fields

        for field in fields:
            validate_method = getattr(self, 'validate_' + field.field_name, None)
            primitive_value = field.get_value(data)
            try:
                validated_value = field.run_validation(primitive_value)
                if validate_method is not None:
                    validated_value = validate_method(validated_value)
            except ValidationError as exc:
                errors[field.field_name] = exc.detail
            except DjangoValidationError as exc:
                errors[field.field_name] = get_error_detail(exc)
            except SkipField:
                pass
            else:
                set_value(ret, field.source_attrs, validated_value)

        if errors:
            raise ValidationError(errors)

        return ret

to_internal_value メソッドは、受信した生データを内部値に変換する、つまり外部データをモデルの属性にマップするために使用されます。

受信した生データ データ:

  • 受信する生データは、キーと値のペアで構成されるデータ構造である辞書タイプ (マッピング) にすることができます。このコードでは、データ型がマッピングであるかどうかを判断することで、受信要件が満たされているかどうかを判断します。辞書型ではない場合、検証エラーがスローされます。ディクショナリ タイプのデータは、{'key': 'value'} の形式にすることができます。ここで、キーと値は、任意の有効な Python データ型にすることができます。

1. このメソッドでは、まず受信データが辞書型 (マッピング) であるかどうかを判断します。辞書型でない場合は、検証エラーがスローされ、エラー メッセージが返されます。次に、変換された内部値を格納するための順序付きディクショナリ ret と、検証中にエラー メッセージを格納するための順序付きディクショナリ error を作成します。

2. 次に、書き込み可能なフィールド (_writable_fields) のリストを取得し、それぞれのフィールドを反復処理します。各フィールドについて、まずフィールド検証メソッド (validate_method) の取得を試み、次にフィールドの get_value(data) メソッドを通じて元のデータの値を取得します。

3. 次に、元の値に対して検証および変換操作を実行し、フィールドの run_validation メソッドを使用して検証を実行し、元の値を検証済みの値に変換します。フィールドで検証メソッド (validate_method) が定義されている場合、検証された値をさらに処理するためにこのメソッドが呼び出されます。

検証中に、検証が失敗したことを示す ValidationError または DjangoValidationError 例外がスローされる場合があります。このとき、エラー情報はエラー辞書に保存され、フィールド名がキー、エラー内容が値として使用されます。

検証プロセス中に SkipField 例外が発生した場合、このフィールドの検証操作をスキップし、次のフィールドに直接入力することを意味します。

最後に、エラー ディクショナリにエラー情報が含まれている場合は、すべてのフィールドの検証エラー情報を含む ValidationError 例外がスローされます。エラーがなければ、変換された内部値 ret が返されます。

要約すると、 to_internal_value メソッドは、外部受信データを内部値に変換するための Django REST フレームワークのコア メソッドであり、検証および変換操作を通じて外部データをモデル属性にマップし、検証中に発生する可能性のあるエラーを処理します。

to_internal_value() メソッドの戻り値:

        """
        Dict of native values <- Dict of primitive datatypes.
        """

「プリミティブデータ型の辞書」とは、値がプリミティブデータ型のデータである辞書を指します。一般的なプリミティブ データ型には、整数 (int)、浮動小数点数 (float)、文字列 (string)、ブール値 (boolean) などが含まれます。

「ネイティブ値の辞書」とは、値がネイティブ データ型の値である辞書を意味します。Python では、これらのネイティブ データ型は、int、float、str、bool などの組み込みデータ型と一致します。

したがって、「ネイティブ値の辞書 <- プリミティブ データ型の辞書」とは、辞書内のプリミティブ データ型の値を、対応するネイティブ データ型の値に変換することを意味します。この変換プロセスは、int()、float()、str()、bool() などのメソッドを使用して値を対応するネイティブ データ型に変換するなど、Python の組み込み関数を通じて実行できます。最終結果は、キーは同じですが、値はネイティブ データ型であるディクショナリになります。

to_internal_value メソッドの戻り値は通常、変換された内部値を表す辞書型 (Mapping ) です。コードでは、結果変数は処理されたデータを保存する辞書です。

3.1.3 to_internal_value() メソッドを書き換える

    def to_internal_value(self, data):
        result = super().to_internal_value(data)
        result['project'] = result.pop('project_id')
        return result

このコードでは、to_internal_value メソッドは最初に親クラスの to_internal_value メソッドを呼び出し、パラメーター データを渡します。このメソッドは親クラスから継承され、デフォルトの実装は受信データを内部値に変換します。

次に、コード行 result['project'] = result.pop('project_id') は、キーが 'project_id' である値を辞書から取得し、それをキーとして 'project' を使用して結果辞書に追加します。同時に、 result.pop('project_id') は、元の辞書内のキーが 'project_id' であるキーと値のペアを削除します。

最後に、処理結果の辞書を返します。

このコードの機能は、受信データから「project_id」キーと値のペアを抽出し、その名前を「project」に変更して、処理された辞書を返すことです。このようにして、データのフィールド名変更​​操作を実現できます。

4. 見る

class InterfaceViewSet(RunMixin, viewsets.ModelViewSet):
    queryset = Interfaces.objects.all()
    serializer_class = serializers.InterfaceModelSerilizer
    permission_classes = [permissions.IsAuthenticated]

 

おすすめ

転載: blog.csdn.net/qq_39208536/article/details/131764604