Django GraphQL Mutation 已更新,但数据库没有变化

问题描述

我创建了一个更新突变如下,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

有人能找出原因吗?

解决方法

您的代码中有几个问题:

  1. 您不能使用这样的字符串分配模型字段。请参阅 this 线程
for k,v in kwargs.items():
   member_instance.k = v
   member_instance.save()

目前您的 member_instance.k 与 for 循环内的变量 k 无关。

  1. 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()