具有整数字段的 Django Graphene 表单验证

Django Graphene form validation with integer field

这是我的简单场景。我的模型有两个必填字段名称和年龄:

class Person(models.Model):
    name = models.CharField(max_length=256)
    age = models.PositiveIntegerField()

我正在使用带有石墨烯的 Django 模型表单

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ('name', 'age')

class PersonType(DjangoObjectType):
    class Meta:
        model = Person

class PersonMutation(DjangoModelFormMutation):
    class Meta:
        form_class = PersonForm

class Mutation(graphene.ObjectType):
    person_mutation = PersonMutation.Field()

假设一个人填写了年龄字段但没有填写姓名字段。然后我可以发送一个突变查询

mutation {
  personMutation(input: {age: 25, name: ""}) {
    errors {
      field
      messages
    }
  }
}

我得到以下响应,这正是我想要的。此响应很容易通过,我收到名称字段验证消息。

{
  "data": {
    "personMutation": {
      "errors": [
        {
          "field": "name",
          "messages": [
            "This field is required."
          ]
        }
      ]
    }
  }
}

但是如果用户填写的是姓名而不是年龄怎么办?我应该做什么样的突变查询?

如果我

mutation {
  personMutation(input: {name: "my name"}) {
    errors {
      field
      messages
    }
  }
}

我收到以下回复。这是一条可怕的消息,我无法向用户显示。响应 json 格式也与以前不同。

{
  "errors": [
    {
      "message": "Argument \"input\" has invalid value {name: \"my name\"}.\nIn field \"age\": Expected \"Int!\", found null.",
      "locations": [
        {
          "line": 2,
          "column": 25
        }
      ]
    }
  ]
}

如果我尝试将 age: nullage: "" 作为输入参数,它也不会更好。那么如何在未设置年龄时获取 Django 的 "This field is required" 验证消息?

Graphene 给出即时错误消息,因为在模型中,两个字段都是 blank=False(默认值),这使得字段的形式为 required=Truesee doc)。 我想如果你只查询年龄而根本没有名字甚至没有空字符串你会得到一个类似的错误消息。

关于如何避免这个问题的一些想法:

  1. 在您的模型中创建字段 blank=True。然后您需要检查您的后端是否设置了值,如果没有设置则生成自定义错误消息。

  2. 在您的模型中创建字段 blank=False(默认)并将其留给前端以检查是否设置了字段。例如。如果没有设置所有必需的值,请禁用 "send" 按钮。我认为哪种方式更好。