首页 > 解决方案 > 在序列化程序 django rest 框架中使用非主键验证外键字段

问题描述

我正在使用 Django Rest 框架来创建 API。我有以下型号:

class Currency(models.Model):
    name = models.CharField(max_length=15)
    code = models.CharField(max_length=5)
    exchange_rate = models.DecimalField(max_digits=5, decimal_places=4)

这是 API 请求的序列化程序-

class WalletCreditSerializer(serializers.Serializer):
    wallet = serializers.PrimaryKeyRelatedField(queryset=Wallet.objects.all())
    amount = serializers.DecimalField(max_digits=10, decimal_places=4)
    currency = serializers.PrimaryKeyRelatedField(queryset=Currency.objects.all())
    message = serializers.CharField(max_length=150, allow_null=True)

当我在请求中传递货币 ID 时,序列化程序运行良好

{
    "wallet": 1,
    "amount": 23,
    "currency": 1,
    "message": "Test message"
}

但要求是通过货币代码

{
    "wallet": 1,
    "amount": 23,
    "currency": "USD",
    "message": "Test message"
}

实现这一目标的最佳方法是什么?有人可以提供一个例子吗?

标签: pythondjangoserializationdjango-rest-frameworkdjango-serializer

解决方案


您可以通过使用“PrimaryKeyRelatedField”中的“pk_field”参数来实现这一点

currency=serializers.PrimaryKeyRelatedField(queryset=Currencies.objects.all(), pk_field='code')

或者通过使用'CharField'和这样的验证:

class WalletCreditSerializer(serializers.Serializer):
    wallet = serializers.PrimaryKeyRelatedField(queryset=Wallet.objects.all())
    amount = serializers.DecimalField(max_digits=10, decimal_places=4)
    currency = serializers.CharField(max_length=150, allow_null=False)
    message = serializers.CharField(max_length=150, allow_null=True)

    def validate_currency(value):
        currency = Currencies.objects.filter(code=value).first()
        if not currency:
            raise ValidationError("error message here")
        returnt currency

推荐阅读