ジャンゴレストフレームワーク:シリアライザーの力( 1 )


Water has been taken for granted. - Jan Eliasson


DRFのシリアライザーは、殺害機能であることが証明されました.
ここでは、シリアライザーを使用して逆の関係オブジェクトを更新しながら、外部キーオブジェクトデータを更新する詳細を共有します.
ここでのポイントは、通常、読み取り操作のためにシリアライザーで外部キーフィールドを使用している間、操作を書くためにそれらを使用することもできます.

FKオブジェクトデータを更新する
シナリオを考えましょう.
ここで我々は、ローンのアプリケーションを提出することができますアカウントがあります.アプリケーションを承認しながら、我々はapproved_amount and reason .
class Account(models.Model):
    account_number = models.CharField(max_length=255)
    approved_amount = models.PositiveIntegerField(default=0)
    reason = models.CharField(max_length=255, null=True, blank=True)

    def __str__(self):
        return self.account_number


class LoanApplication(models.Model):

    class Status(models.TextChoices):
        SUBMITTED = 'SUBMITTED', 'Submitted',
        REJECTED = 'REJECTED', 'Rejected'
        APPROVED = 'APPROVED', 'Approved'

    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    status = models.CharField(
        max_length=255, choices=Status.choices, default=Status.SUBMITTED)

    def __str__(self):
        return str(self.account)
上記の要件は1つのAPI呼び出しだけを使用しなければなりません.
上記のコードショットに示すように、我々はapproved_amount and reasonAccount モデルは、承認をしますLoanApplication オブジェクト.
Serializerが上記の問題に取り組む方法を見ましょう.
以下のショットのように、承認中に、我々は同じAPIで量と理由を収集します.シリアライズではLoanApplication , 我々は分離するAccount データと適切なアカウントに更新し、ローンのアプリケーションを更新するに進みます.
class AccountSerializer(serializers.ModelSerializer):

    class Meta:
        model = Account
        fields = '__all__'


class LoanApplicationSerializer(serializers.ModelSerializer):
    approved_amount = serializers.IntegerField(
        source='account.approved_amount')
    reason = serializers.CharField(source='account.reason')

    class Meta:
        model = LoanApplication
        exclude = ('account',)

    def update(self, instance, validated_data):
        account_data = validated_data.pop('account', None)
        if account_data:
            account_serializer = AccountSerializer(
                instance.account, data=account_data, partial=True)
            account_serializer.is_valid(raise_exception=True)
            account_serializer.save()

        return super().update(instance, validated_data)

リンク
  • Github code