问题描述
我创建了一个更新突变如下,django==3.1.4和graphene==2.1.8:
# models.py
class CustomUser(AbstractUser):
# email = models.EmailField()
firebase_id = models.CharField(max_length=50,null=True)
nickname = models.CharField(max_length=50,null=True)
name = models.CharField(max_length=20,null=True)
gender = models.IntegerField(choices=Gender,default=3)
phone = models.CharField(max_length=20,null=True)
birthday = models.DateField(default=datetime(2020,1,1))
address = models.CharField(max_length=200,null=True)
profile_image = models.ImageField(default='default-avatar.png',upload_to='users/',null=True,blank=True)
class UpdateMember(graphene.Mutation):
class Arguments:
firebase_id = graphene.String(required=True)
nickname = graphene.String()
name = graphene.String()
gender = graphene.Int()
phone = graphene.String()
birthday = graphene.Date()
address = graphene.String()
profile_image = graphene.String()
class Meta:
exclude = ["password"]
member = graphene.Field(MemberType)
success = graphene.Boolean()
# @login_required
@staticmethod
def mutate(root,info,firebase_id,**kwargs):
success = False
member_instance = CustomUser.objects.get(firebase_id=firebase_id)
if member_instance:
print(member_instance)
success = True
for k,v in kwargs.items():
member_instance.k = v
member_instance.save()
return UpdateMember(member=member_instance,success=True)
else:
return UpdateMember(member=None,success=False)
在下面运行 GQL:
mutation {
updateMember(
firebaseId:"777",name:"JJJJ")
{
success
}
}
回复:
{
"data": {
"updateMember": {
"success": true
}
}
}
但是我查了数据库,好像没有什么变化,我觉得.save()
应该把数据库持久化的工作做好了......
创建成员工作正常。使用 Postgressql
有人能找出原因吗?
解决方法
您的代码中有几个问题:
- 您不能使用这样的字符串分配模型字段。请参阅 this 线程
for k,v in kwargs.items():
member_instance.k = v
member_instance.save()
目前您的 member_instance.k
与 for 循环内的变量 k
无关。
-
firebase_id
字段应该是唯一的。 目前您调用CustomUser.objects.get(firebase_id=firebase_id)
是有风险的,因为 firebase_id 不是唯一字段。如果您保存了多个使用相同 ID 的 CustomUser,这可能会导致Multiple objects
错误。要修复它,只需定义:
class CustomUser(AbstractUser):
# email = models.EmailField()
firebase_id = models.CharField(max_length=50,unique=True)
...
检查您的 member_instance
是否真的更新了。例如,您可以在保存之前打印出这些值,并在最终实现之前运行一些测试用例。例如:
if member_instance:
print(member_instance)
success = True
for k,v in kwargs.items():
member_instance.k = v
print(member_instance.k)
print(k)
print(getattr(member_instance,k))
member_instance.save()