python - 在序列化程序 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"
}
实现这一目标的最佳方法是什么?有人可以提供一个例子吗?
解决方案
您可以通过使用“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
推荐阅读
- sql-server - 在映射到标量函数的默认值中获取 @@identity 或 Scope_identity()
- mysql - 如何在 SQL 中表示浮点值
- python - TypeError: 'module' object is not callable error using Selenium ChromeDriver Chrome with Python
- python - 将4行数据读入一行pandas数据框
- cube - 为什么构建多维数据集时日志总是显示“无可用数据”?
- python - Why does rounding the floating-point number 1.4999999999999999 produce 2?
- php - 在帮助文件中调用函数
- c++ - 如何委托给实现类
- javascript - 如何按“包含”对数组进行排序?
- r - 如何通过计数数据在 R 中创建 100% 堆积条形图?