python - 如何在 ModelSerializer 的 create 方法中实现 update_or_create
问题描述
编码:
类 OTP(AppModel): phone_regex = RegexValidator(regex=r'^[6789]\d{9}$', message="电话号码无效。") phone_number = models.CharField(validators=[phone_regex], max_length=10, unique=True) 代码 = models.CharField(max_length=255) def __str__(self): 返回 str(self.phone_number) + ": "+str(self.code) 类 OTPSerializer(serializers.ModelSerializer): code = serializers.CharField(max_length=None, required=False) 元类: 型号 = OTP 字段 = ('id', 'code', 'phone_number') read_only_fields=('id', 'code') @transaction.atomic 定义创建(自我,验证数据): phone_number = 已验证数据.pop("phone_number") otp, 创建 = OTP.objects.update_or_create( phone_number=phone_number,默认值={"code": generate_otp()}) 返回 otp
我正在尝试在's的方法update_or_create
里面做。create
django-rest-framework
ModelSerializer
但是,phone_number
模型内的字段OTP
必须是unique
. 因此unique=True
.
我能够发布phone_number
并创建对象。但是,phone_number
再次发布相同的内容会引发错误otp with this phone number already exists
,而不是在它已经存在时更新它,因为我已经覆盖了该create
方法。请帮忙!
解决方案
您可以phone_number
不要求,然后手动进行检查。您会收到错误消息,因为 DRFphone_number
在您执行之前已验证。因此,基本上,解决方案可能如下(仅序列化代码):
class OTPSerializer(serializers.ModelSerializer):
code = serializers.CharField(max_length=None, required=False)
class Meta:
model = OTP
fields = ('id', 'code', 'phone_number')
read_only_fields=('id', 'code')
extra_kwargs = {'phone_number': {'required': False}}
@transaction.atomic
def create(self, validated_data):
phone_number = validated_data.pop("phone_number")
otp, created = OTP.objects.update_or_create(
phone_number=phone_number, defaults={"code": generate_otp()})
return otp
推荐阅读
- twilio - 在进行出站呼叫时将自定义呼叫者 ID 设置为 twilio 号码
- go - 如何使用接受 multipart/form-data 的 goDoc 记录我的服务端点
- java - 有没有办法在 Adapter 类之外检查 RecyclerView 类是否为空?
- redis - 如何获取 Redis 集群中每个客户端的连接数
- c++ - 我的 C++ hello world 程序无法使用 Build 脚本在 Atom IDE 中编译
- android - 将 Hilt @IntallIn 用于具有静态提供方法的 dagger-2 模块
- mysql - 如何在sql中将重复条目计为一个
- odoo - 聊天中的 Odoo 链接不引用实际域,而是使用 IP
- python - 有没有办法使用在 tkinter 中添加标签的相同按钮删除标签?
- c# - 使用 LINQ Lambda 表达式按组和 where 条件确定值