如何在 graphene django 中添加数据库中不存在的自定义字段
how to add a custom field that is not present in database in graphene django
所以我的模型看起来像
class Abcd(models.Model):
name = models.CharField(max_length=30, default=False)
data = models.CharField(max_length=500, blank=True, default=False)
需要在查询时传递不是模型一部分的字典,查询是
query {
allAbcd(Name: "XYZ") {
edges {
node {
Data
}
}
}
}
如何通过查询传递这样一个自定义字段?
此自定义字段是其他流程目的所必需的。
Graphene 使用 Types 来解析节点,这些节点与模型完全无关,您甚至可以定义与任何模型无关的 Graphene Type。无论如何,您正在寻找的用例非常简单。假设我们有一个模型名称 User
,我假设这个 Data
需要由模型的解析器解析。
from graphene.relay import Node
from graphene import ObjectType, JSONField, String
from graphene_django import DjangoObjectType
from app.models import User
class UserType(DjangoObjectType):
class Meta:
filter_fields = {'id': ['exact']}
model = User
custom_field = JSONField()
hello_world = String()
@staticmethod
def resolve_custom_field(root, info, **kwargs):
return {'msg': 'That was easy!'} # or json.dumps perhaps? you get the idea
@staticmethod
def resolve_hello_world(root, info, **kwargs):
return 'Hello, World!'
class Query(ObjectType):
user = Node.Field(UserType)
all_users = DjangoFilterConnectionField(ProjectType)
小例子:
品牌型号
class Brand(models.Model):
name = models.CharField(max_length=100, null=False)
def __str__(self):
return self.name
品牌节点
class BrandNode(DjangoObjectType):
# extra field INT
extra_field_real_id_plus_one = graphene.Int()
def resolve_extra_field_real_id_plus_one(parent, info, **kwargs):
value = parent.id + 1
print(f'Real Id: {parent.id}')
print(f'Id ++: {value}')
return value
class Meta:
model = Brand
filter_fields = {
'name': ['icontains', 'exact']
}
interfaces = (relay.Node,)
extra_field_real_id_plus_one
是额外的字段。您可以从原始模型中获取任何值,正是从 parent
参数中获取的。您可以根据需要计算或格式化任何内容,只需要 return 值即可。
您可以在查询、突变等中获取额外的字段计算值
所以我的模型看起来像
class Abcd(models.Model):
name = models.CharField(max_length=30, default=False)
data = models.CharField(max_length=500, blank=True, default=False)
需要在查询时传递不是模型一部分的字典,查询是
query {
allAbcd(Name: "XYZ") {
edges {
node {
Data
}
}
}
}
如何通过查询传递这样一个自定义字段?
此自定义字段是其他流程目的所必需的。
Graphene 使用 Types 来解析节点,这些节点与模型完全无关,您甚至可以定义与任何模型无关的 Graphene Type。无论如何,您正在寻找的用例非常简单。假设我们有一个模型名称 User
,我假设这个 Data
需要由模型的解析器解析。
from graphene.relay import Node
from graphene import ObjectType, JSONField, String
from graphene_django import DjangoObjectType
from app.models import User
class UserType(DjangoObjectType):
class Meta:
filter_fields = {'id': ['exact']}
model = User
custom_field = JSONField()
hello_world = String()
@staticmethod
def resolve_custom_field(root, info, **kwargs):
return {'msg': 'That was easy!'} # or json.dumps perhaps? you get the idea
@staticmethod
def resolve_hello_world(root, info, **kwargs):
return 'Hello, World!'
class Query(ObjectType):
user = Node.Field(UserType)
all_users = DjangoFilterConnectionField(ProjectType)
小例子:
品牌型号
class Brand(models.Model):
name = models.CharField(max_length=100, null=False)
def __str__(self):
return self.name
品牌节点
class BrandNode(DjangoObjectType):
# extra field INT
extra_field_real_id_plus_one = graphene.Int()
def resolve_extra_field_real_id_plus_one(parent, info, **kwargs):
value = parent.id + 1
print(f'Real Id: {parent.id}')
print(f'Id ++: {value}')
return value
class Meta:
model = Brand
filter_fields = {
'name': ['icontains', 'exact']
}
interfaces = (relay.Node,)
extra_field_real_id_plus_one
是额外的字段。您可以从原始模型中获取任何值,正是从 parent
参数中获取的。您可以根据需要计算或格式化任何内容,只需要 return 值即可。
您可以在查询、突变等中获取额外的字段计算值