我想知道如何正确创建用于创建此 Django 模型的突变:
class Company(models.Model):
class Meta:
db_table = 'companies'
app_label = 'core'
default_permissions = ()
name = models.CharField(unique=True, max_length=50, null=False)
email = models.EmailField(unique=True, null=False)
phone_number = models.CharField(max_length=13, null=True)
address = models.TextField(max_length=100, null=False)
crn = models.CharField(max_length=20, null=False)
tax = models.CharField(max_length=20, null=False)
parent = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
currency = models.ForeignKey(Currency, null=False, on_delete=models.CASCADE)
country = models.ForeignKey(Country, null=False, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
如您所见,共有三个外键。对于模型Currency、Country和Parent(self)。公司 DjangoObjectType看起来非常简单,如下所示:
class CompanyType(DjangoObjectType):
class Meta:
model = Company
Run Code Online (Sandbox Code Playgroud)
最后我的变异类 …
我正在尝试这样做(见标题),但它有点复杂,因为我试图构建的字符串必须具有以下属性:
使用普通的''''''多行字符串会使注入变量变得困难。使用多个 f 字符串使得注入变量变得容易,但是每个花括号,其中有很多,必须加倍。并且f必须在每行之前添加一个。另一方面,如果我尝试使用format,它也会被所有的花括号混淆。
有没有更好的方法我还没有考虑过?
我使用graphen-django构建GraphQL API.我已成功创建此API,但我无法传递参数来过滤我的响应.
这是我的models.py:
from django.db import models
class Application(models.Model):
name = models.CharField("nom", unique=True, max_length=255)
sonarQube_URL = models.CharField("Url SonarQube", max_length=255, blank=True, null=True)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
这是我的schema.py:从graphene_django导入石墨烯从模型导入应用程序导入DjangoObjectType
class Applications(DjangoObjectType):
class Meta:
model = Application
class Query(graphene.ObjectType):
applications = graphene.List(Applications)
@graphene.resolve_only_args
def resolve_applications(self):
return Application.objects.all()
schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)
我的urls.py:
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^admin/', admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', authviews.obtain_auth_token),
url(r'^graphql', GraphQLView.as_view(graphiql=True)),
]
Run Code Online (Sandbox Code Playgroud)
如您所见,我还有一个REST API.
我的settings.py包含:
GRAPHENE = {
'SCHEMA': 'tibco.schema.schema'
}
Run Code Online (Sandbox Code Playgroud)
我遵循这个: …
目前使用graphene-python 和graphene-django(和graphene-django-optimizer)。
收到GraphQL查询后,数据库查询在几分之一秒内成功完成;然而,石墨烯在另外 10 多秒内不会发送响应。如果我增加响应中发送的数据,响应时间会线性增加(三倍数据 = 三倍响应时间)。
正在检索的数据由嵌套对象组成,最多 7 层深,但使用优化的查询,这不会影响从数据库检索数据所需的时间,因此我假设延迟与 graphene-python 有关将结果解析为 GraphQL 响应。
我无法弄清楚如何分析执行以确定花费这么长时间的时间——在 Django 上运行 cProfiler 似乎没有跟踪石墨烯的执行。
SQL Query 响应时间是使用 graphene-django-debugger 中间件确定的,结果如下所示:
"_debug": {
"sql": [
{
"duration": 0.0016078948974609375,
"isSlow": false,
"rawSql": "SELECT SYSDATETIME()"
},
{
"duration": 0.0014908313751220703,
"isSlow": false,
"rawSql": "SELECT [redacted]"
},
{
"duration": 0.0014371871948242188,
"isSlow": false,
"rawSql": "SELECT [redacted]"
},
{
"duration": 0.001291036605834961,
"isSlow": false,
"rawSql": "SELECT [redacted]"
},
{
"duration": 0.0013201236724853516,
"isSlow": false,
"rawSql": "SELECT [redacted]"
},
{
"duration": 0.0015559196472167969,
"isSlow": false,
"rawSql": "SELECT …Run Code Online (Sandbox Code Playgroud) 假设我有这样的模型
class Order(models.Model):
STATES = [
(1, 'Initiate'),
(2, "Brief"),
(3, "Planning"),
(4, "Price Negotiate"),
(5, "Executing"),
(6, "Pending"),
(7, "Completed"),
(8, "Canceled"),
(9, "Failed"),
(10, "Paid"),
]
state = models.PositiveSmallIntegerField(
choices=STATES,
default=1
)
Run Code Online (Sandbox Code Playgroud)
当我将这个模型与其Graphene对象类型的伴侣配对时
class OrderNode(graphene_django.DjangoObjectType):
class Meta:
model = Order
interfaces = (relay.Node,)
Run Code Online (Sandbox Code Playgroud)
OrderState!创建具有名称的枚举类型.
我很关心
对于第一个问题,我有这个问题
{
customer(id: "Q3VzdG9tZXJOb2RlOjE=") {
name
orders {
edges {
node {
state
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个像A_1和的奇怪的状态值A_2.我期待它给我一些有意义的价值,比如"Initiate".如何获得kv对enum的值?
对于第二个问题,如果我想向用户提供此枚举的可能值列表,我该怎么办?
像Cassandra这样的数据库和像GraphQL这样的方案能很好地协同工作吗?
Cassandra意识形态基于优化查询和非规范化数据的想法.这似乎与GraphQL意识形态没有很好的理解,在这种意识形态中,数据似乎可以在查询的每个级别中访问.
示例:假设我构建了我的Cassandra表,如下所示:
User:
name
address
etc... (many properties)
Group:
id
name
user_name (denormalized user, where we generally just need the name of a user)
Run Code Online (Sandbox Code Playgroud)
但是使用GraphQL,人们不会完全期望非规范化的用户.
query getGroup {
group(id: 1) {
name
users {
name
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以有两件事:1.)这个GraphQL查询最终会多次命中我们的Cassandra数据库(假设没有缓存).获取组名称和每个用户,我们甚至可以为每个用户点击它.但是,假设我们的解决方案使用一个cassandra调用创建多个User对象.
2.)我们无法真正构建一个带有非规范化和graphql的cassandra惯用数据库,我们可以吗?否则,我们应该期望用户的某些属性不会返回给我们查询.
总结一下这个问题,使用非规范化数据的graphql策略是什么?省略客户认为可以访问的某些属性是否可以接受?例如,客户端尝试访问用户的地址但我们目前没有,因为我们的数据是非规范化的.或者甚至不应该担心非规范化,只是让graphQL使用db和graphql之间的缓存机制进行调用.例如,graphql首先获取组,然后获取组ID的用户数据.
假设一个类似于这个的Django模型:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.PROTECT)
name = models.CharField(max_length=255)
other_alias = models.CharField(blank=True,null=True,max_length=255)
@property
def profile_name(self):
if self.other_alias:
return self.other_alias
else:
return self.name
Run Code Online (Sandbox Code Playgroud)
我正在使用Graphene-Django这个项目,我成功地创建了一个描述Profile类型的模式,并且可以通过GraphQL查询正确访问它.但是,我无法看到任何可以使该属性可用的方式.
假设我应该从我的Django模型中删除所有属性风格的逻辑,而只是将GraphQL与模型中的原始信息一起使用,然后在我使用GraphQL数据的地方(例如,在反应使用它的应用程序)?
我想使用Github GraphQl v4 API从Github访问详细信息.我找到了Graphene库,但我不确定如何使用Python中的个人访问令牌进行身份验证.
我试图在Google上搜索,但找不到任何示例.它是可以创建图形模式的Python库,而不是用于消费它们,我尝试使用`requests'但是失败了.我如何进行身份验证并找到存储库列表?
我使用Github GraphQl资源管理器通过以下代码查找存储库列表:
viewer {
repositories(first: 30) {
totalCount
pageInfo {
hasNextPage
endCursor
}
edges {
node {
name
}
}
}
Run Code Online (Sandbox Code Playgroud) 我几乎花了 3 天时间才找到在 python 石墨烯中创建动态模式的方法。我能找到的唯一相关结果是以下链接:https : //github.com/graphql-python/graphene/blob/master/graphene/types/dynamic.py 但我找不到任何相关文档。
整个想法是创建一个动态模式。我想提供一个与 GraphQL 兼容的 API,即使模型没有在代码中定义,用户也可以查询我的内容。换句话说,我想即时创建模型。我不知道该怎么办。
如果你能提供一个例子,那将是一个很大的帮助。
更新 :
我的项目是一个无头 CMS,它具有用户可以创建自己的内容类型的功能,我想提供一个 GraphQL 界面,让一切变得更简单、更灵活。
这是我在 DB 中的内容类型的示例:
{
"id": "author",
"name": "Book Author",
"desc": "",
"options":[
{
"id": "author_faname",
"label": "Sample Sample",
"type": "text",
"required": true,
"placeholder":"One Two Three Four"
},
{
"id": "author_enname",
"label": "Sample label",
"type": "text",
"required": true,
"placeholder":"Sample Placeholder"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是基于该内容类型在数据库中存储的内容:
{
"id": "9rqgbrox10",
"content_type": "author",
"data":{
"author_fname":"Jimmy",
"author_ename":"Hello"
}
}
Run Code Online (Sandbox Code Playgroud)
现在因为我的模型没有在代码中声明并且它们完全在数据库中,我想即时制作我的模式,我不知道什么是最好的解决方案。我知道应该有一种方法,因为其他 Headless CMS 项目正在提供这种方法。
提前致谢!
我在我们的GraphQL服务器上将django-graphene与Relay一起使用。该实现在类中强加了全局ID要求,该要求覆盖并隐藏Django的ID字段。graphene.relay.Node
结果,我可以这样查询:
{
allBatches(id:"QmF0Y2hOb2RlOjE=") {
edges {
node {
id
pk
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并获得以下响应:
{
"data": {
"allBatches": {
"edges": [
{
"node": {
"id": "QmF0Y2hOb2RlOjE=",
"pk": 1
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我失去的是能够按对象本身的原始ID(或PK)字段进行过滤的功能:
{
allBatches(id:1) {
edges {
node {
id
pk
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,我根本无法通过ID过滤对象。我可以想到两种可能的解决方法:1.防止django-graphene-relay劫持和遮蔽该id字段,也许强迫它使用其他字段名称,例如gid
2.查找一种将其包括pk为特殊字段的方法可作为属性和过滤器使用
我在1上没有取得任何进展,因为看起来django-graphene(似乎是中继标准)强加了对该字段的限制id。我看到它id已在多个地方用作魔术字符串,并且似乎没有改变字段名称的标准方法。
在2上,我可以使该属性Mixin像这样工作:
class PKMixin(object): …Run Code Online (Sandbox Code Playgroud) graphene-python ×10
graphql ×9
django ×6
python ×6
cassandra ×1
facebook ×1
python-2.7 ×1
python-3.x ×1
react-apollo ×1
relay ×1