Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用多层嵌套外键写入突变的Django Graphene

用多层嵌套外键写入突变的Django Graphene
EN

Stack Overflow用户
提问于 2020-10-18 21:47:29
回答 1查看 3.5K关注 0票数 3

如何编写嵌套外键的架构和查询?我检查了文档,没有找到如何做到这一点的例子。下面是我基于github和堆栈溢出回答的尝试,让我们说我有以下模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Address(models.Model):
    name = models.CharField()

class Person(models.Model):
    name = models.CharField()
    address = models.ForeignKey('Address', on_delete=models.CASCADE, blank=False, null=False)

class Blog(models.Model):
    person = models.ForeignKey('Person', on_delete=models.CASCADE, blank=False, null=False)
    text = models.TextField()

我试着编写了这样一个模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AddressInput(graphene.InputObjectType):

    name = graphene.String(required=True)


class PersonInput(graphene.InputObjectType):

    name = graphene.String(required=True)
    address =graphene.Field(AddressInput)

class CreateNewBlog(graphene.Mutation):

    blog=graphene.Field(BlogType)

    class Arguments:
        address_data = AddressInput()
        person_data = PersonInput()
        text = graphene.String()

    @staticmethod
    def mutate(root, info, person_data=None, address_data=None, **input):

        address = Address.objects.create(name=address_data.name)
        person = Person.objects.create(address=address, name=person_data.name)
        blog = Blog.objects.create(person =person, text=input['text'])
        blog.save()

        return CreateNewBlog(blog=blog)

我用了这样的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mutation {
        CreateNewBlog(person: { address: {name: "aaa"}, 
            name: "First Last" }, text: "hi hi") {
            Blog {
              person{
                name
                address{
                  name
                }
              },
              text
                
            }
        }
}

我收到了一条错误消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "errors": [
    {
      "message": "'NoneType' object has no attribute 'name'",
      "locations": [
        {
          "line": 32,
          "column": 9
        }
      ],
      "path": [
        "CreateNewBlog"
      ]
    }
  ],
  "data": {
    "CreateNewBlog": null
  }
}

我认为问题在于我编写schema.py文件的方式。将InputFields嵌套到另一个InputField中不起作用的地方。还有其他方法来写一个突变吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 05:53:41

好吧这里有几件事。首先,您应该生成您的schema.graphql文件,因为这将显示Graphene构建的模式的实际最终形状,这将使您的调试变得更容易。或者,您可以使用GraphiQL测试查询,并让它的文档和自动完成为您完成繁重的工作。

但具体而言,你的石墨烯突变定义将产生一个突变,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
input AddressInput {
  name: String!
}

input PersonInput {
  name: String!
  address: AddressInput
}

type CreateNewBlogOutput {
  blog: Blog
}

type Mutation {
  CreateNewBlog(addressData: AddressInput, personData: PersonInput, text: String): CreateNewBlogOutput!
}

值得注意的是,在这里提供AddressInput有两种方法,一种是根方式,另一种是在PersonInput中。这可能不是你想要做的。其次,不需要任何根参数,这会导致错误消息非常无助,因为问题是您调用的是不正确的变异参数,但是查询验证器允许它通过,因为您的类型非常允许。

我相信,如果你像下面这样运行这种突变,它实际上会起作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mutation {
  CreateNewBlog(
    personData: {
      address: {
        name: "aaa"
      }, 
      name: "First Last"
    },
    text: "hi hi"
  ) {
    blog {
      person {
        name
        address {
          name
        }
      }
      text
    }
  }
}

我在这里只做了两个修改,person被更改为personData (为了与您的突变定义相匹配,Graphene会自动完成从蛇案例到骆驼案例的对话),以及在字段选择中将Blog更改为blog

但让我们再往前走一步,这是我如何制造突变的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AddressInput(graphene.InputObjectType):
    name = graphene.String(required=True)


class PersonInput(graphene.InputObjectType):
    name = graphene.String(required=True)
    address = AddressInput(required=True)


class CreateNewBlogInput(graphene.InputObjectType):
    person = PersonInput(required=True)
    text = graphene.String(required=True)


class CreateNewBlogPayload(graphene.ObjectType):
    blog = graphene.Field(BlogType, required=True)


class CreateNewBlog(graphene.Mutation):
    class Arguments:
        input_data = CreateNewBlogInput(required=True, name="input")

    Output = CreateNewBlogPayload


    @staticmethod
    def mutate(root, info, input_data):
        address = Address.objects.create(name=input_data.person.address.name)
        person = Person.objects.create(address=address, name=input_data.person.name)
        blog = Blog.objects.create(person=person, text=input_data.text)
        blog.save()

        return CreateNewBlogPayload(blog=blog)

在构造Graphene的突变对象时,我还会将CreateNewBlog更改为createNewBlog,因为GraphQL惯例是使用较低的camel大小写进行突变。

然后你就会这样运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mutation {
  createNewBlog(
    input: {
      person: {
        address: {
          name: "aaa"
        }, 
        name: "First Last"
      }
      text: "hi hi"
    }
  ) {
    blog {
      person {
        name
        address {
          name
        }
      }
      text
    }
  }
}

为什么将整个输入封装在一个输入字段中?主要是因为它使得在使用变量时更容易在客户端调用变异,所以您可以只提供正确形状的单个输入arg,而不是多个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// So instead of this
mutation OldCreateNewBlog($person: PersonInput, $text: String) {
  createNewBlog(
    personData: $person
    text: $text
  ) {
    blog {
      person {
        name
        address {
          name
        }
      }
      text
    }
  }
}

// You have this
mutation NewCreateNewBlog($input: CreateNewBlogInput!) {
  createNewBlog(
    input: $input
  ) {
    blog {
      person {
        name
        address {
          name
        }
      }
      text
    }
  }
}

后者使更改输入形状变得更容易,并且只需在客户端代码中的一个位置进行更改。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64421773

复制
相关文章
URL编码和Base64编码
在理清字符集和字符编码关系一文中我们介绍了常见字符集以及字符编码之间的关系,本期我们继续朝着这个方向介绍常见的编码算法。 URL编码 URL编码是浏览器发送数据给服务器时使用的编码,它是编码算法,而不
木可大大
2018/07/25
3.4K0
URL编码和Base64编码
URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。 然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。 为解决此问题,可采用一种用于
张善友
2018/01/22
7.1K1
Base64和URL编解码操作
在下载文件的时候有时候文件名称中含有中文名,下载下来后会乱码,所以就对文件名称进行一些编解码操作,来解决乱码。 BASE64编解码(解决火狐浏览器乱码): new BASE64Encoder().encode(需要编码的字节数组) —> 编码 new BASE64Decoder().decodeBuffer(解码内容) —> 解码 URL编解码: URLEncoder.encode(需要编码的内容, “UTF-8”); —> 编码 URLDecoder.decode(需要解码的内容,“UTF
阿年、嗯啊
2021/04/27
1.8K0
Java 图片URL转Base64编码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/05
3.7K0
Java 图片URL转Base64编码
js 根据url 转换图片(base64)
function getBase64(url, callback) { var Img = new Image(), dataURL = ''; Img.src = url + '?v
我乃小神神
2020/04/16
15.5K2
使用url_launcher打开App
1. 添加依赖 dependencies: url_launcher: ^5.4.11 2. openWebView app _launchURL() async { const url = 'http://it200.cn/'; if (await canLaunch(url)) { await launch(url); } else { throw 'Could not launch $url'; } } 3. openMap App _
前端小鑫同学
2022/12/24
8440
c++报错无法打开文件_如何打开源文件
一、无法打开文件“xxx.lib” 出现这种错误一般为 ①未添加xxx.lib库文件 ②库添加后,路径不对,找不到对应的库文件路径 解决方案: 先查看库文件是否已经添加 若未添加,右击项目->属性->链接器->输入;将库文件加入即可 如果库文件已经添加,仍然报错,此时需要查看生成的库文件的路径了。 先找到生成库文件的路径,右击项目->属性->常规->查看输出目录是否与生成的库文件的路径是否匹配,若不匹配,修改路径即可。
全栈程序员站长
2022/11/01
10.2K0
php使用Base64加密解密URL地址教程
要知道Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,看好是编码,并不是加密。
李洋博客
2021/06/15
2.5K0
php使用Base64加密解密URL地址教程
Base64码常见操作(url链接文件转base64编码、本地文件转base64编码等)
因为是图片,可以复制输出的base64编码到这个网址验证:https://tool.jisuapi.com/base642pic.html 其他base64操作如下:
共饮一杯无
2022/11/28
2.3K0
Groovy Base64 URL和文件名安全编码
Groovy支持Base64编码很长一段时间。 从Groovy 2.5.0开始,我们还可以使用Base64 URL和Filename Safe编码来使用encodeBase64Url方法对字节数组进行编码。 结果是一个Writable对象。 我们可以在Writable对象上调用toString方法来获得String值。 可以使用添加到String类的decodeBase64Url方法使用相同的编码对编码的String值进行解码。
白石
2019/08/22
1.3K0
Go实战 | url和base64编码原理及应用
大家好,我是渔夫子。今天跟大家聊聊在实际工作中遇到的对密文进行base64编码和url转义的一个案例。
Go学堂
2023/01/31
1.1K0
URL scheme实现携带数据打开小程序
我这里做一个快速的整理思路: 1、鉴权调用接口凭证(access_token) 2、 HTTPS 调用 POST 请求地址:
德宏大魔王
2023/08/08
5560
URL scheme实现携带数据打开小程序
vue网络图片url转Base64「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
4.1K0
iOS打开系统功能对应的URL
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"URLString"]] 关于 iOS 系统功能的 URL 汇总列表: 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID V** — prefs:root=General&path=Network/V** Wi-Fi:prefs:root=WIFI 定位服务:prefs:root=LOCATION_SERVICES 个人热点:prefs:roo
程序员不务正业
2018/06/14
9190
Flutter--在浏览器打开URL
在使用Flutter开发的时候,希望在浏览器中打开URL,而在pub_env中已经存在url_launcher库可以实现该功能。
None_Ling
2021/11/24
2K0
Flutter--在浏览器打开URL
如何使用xurlfind3r查找目标域名的已知URL地址
xurlfind3r是一款功能强大的URL地址查询工具,该工具本质上是一个CLI命令行工具,可以帮助广大研究人员从多种在线源来查询目标域名的已知URL地址。
FB客服
2023/10/06
3320
如何使用xurlfind3r查找目标域名的已知URL地址
通过指定的URL获取返回图片的BASE64编码
之前本来都是通过URL直接显示图片的,后来需求变更前端需要图片的base64,但是现在数据库只有URL,写了个方法通过URL获取图片的BASE64
彼岸舞
2021/05/18
3K0
Filter实现登录后自动跳转目标url
马 克-to-win:下面我们将利用Filter技术完成一个稍微实用一点的需求。需求的内容如下:一言以蔽之,我们就想保护internal目录下的所有 资源,(其他地方不保护)。具体有这么几点:如果用户非法访问internal目录下的资源,就将他导向internal目录下的login.jsp。如 果在login.jsp当中,他输入了正确的用户名和密码,就让他自动跳转到他原来想访问的那个jsp。但如果在一开始,用户直接就想访问 login.jsp,即使他输入了正确的用户名和密码,也只把他导向回根目录的首页index.jsp。这里需求有两个难点。一是自动跳转到他原来想访问 的那个jsp,这需要把他原来想要访问的目标给存在Session当中。想得到他想访问的目标,就用 (HttpServletRequest)hsr.getRequestURI()。马克-to-win:这还不算难。第二个难点就更难。我怎么能知道用 户一开始的目的就是想访问login.jsp,还是用户一开始想访问internal目录里其他的资源而被导到login.jsp的呢?因为 login.jsp也在internal目录里,所以到达login.jsp之前,无论如何要经过Filter。问题好像很困难。这里,我是这样完成这个 需求的:当用户想非法访问internal目录下的任何资源前一瞬间(除了login.jsp自己,这一点你要加判断,desURL.endsWith ("login.jsp"),否则逻辑上会出问题,不信你试试),我在request范围里加上一个标志:illegal。马克-to-win:只有这种 情况,我才加这个标志。这样在login.jsp的正常程序前,我再加一个判断,看是否有这个标志?如果有,就证明用户想非法访问internal目录下 的某个资源。如果没有这个标志,就说明用户一开始就想访问login.jsp。
马克java社区
2021/07/30
1.3K0
C# Base64上传文件
/// <summary> /// base64转换为图片并保存在指定目录中 /// </summary> /// <param name="strbase64">64Base码</param> /// <returns></returns> public static void Base64ToImage(string strbase64) { var encodedImage = strbase64.Split(',')[1]; var decodedImage = Convert.Fr
小语雀网
2021/09/08
9570
点击加载更多

相似问题

目标C中的URL安全Base64

20

转换Base64 GZipped字符串目标-c或Swift

12

目标C中的JavaScript Base64加密url、解密

12

如何在Swift或目标C中从UIImage获取URL?

25

目标-c Base64编码

49
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文