具有中继限制查询访问的 Django 石墨烯基于 ID
Django graphene with relay restricting queries access based on ID
我试图将单个对象查询限制为创建它们的用户。
Models.py
class Env(models.Model):
name = models.CharField(max_length=50)
user = models.ForeignKey(
User, on_delete=models.CASCADE)
description = TextField()
Schema.py
class EnvNode(DjangoObjectType):
class Meta:
model = Env
filter_fields = {
'name': ['iexact'],
'description': ['exact', 'icontains'],
}
interfaces = (relay.Node, )
Query(object):
env = relay.Node.Field(EnvNode)
all_envs = DjangoFilterConnectionField(EnvNode)
我尝试添加一个解析查询,但它 与过滤器一起使用并且不适用于单个对象查询
def resolve_env(self, info):
env = Env.objects.filter(user = info.context.user.id)
if env is not None:
return env
else:
return None
还尝试按照建议将 class 方法添加到 EnvNode here under filtering Node based ID access:
@classmethod
def get_node(context, cls, id, info):
try:
env = cls._meta.model.objects.get(id = id)
except cls._meta.model.DoesNotExist:
return None
if context.user == env.user:
return env
return None
但是我得到一个错误:
"message": "get_node() missing 1 required positional argument: 'info'",
似乎文档不正确,而且您的参数对于 get_node 方法的顺序也不正确。
调用只有三个参数
- 第一个是你的 DjangoObjectType 子类:EnvNode
- 第二个是 graphql.execution.base.ResolveInfo,其中包含对上下文的引用。您可以从那里获取用户对象。
- 第三个是对象的实际 id。
你应该这样写才能使限制生效:
@classmethod
def get_node(cls, info, id):
try:
env = cls._meta.model.objects.get(id=id, user=info.context.user)
except cls._meta.model.DoesNotExist:
return None
return env
希望对您有所帮助。
我试图将单个对象查询限制为创建它们的用户。
Models.py
class Env(models.Model):
name = models.CharField(max_length=50)
user = models.ForeignKey(
User, on_delete=models.CASCADE)
description = TextField()
Schema.py
class EnvNode(DjangoObjectType):
class Meta:
model = Env
filter_fields = {
'name': ['iexact'],
'description': ['exact', 'icontains'],
}
interfaces = (relay.Node, )
Query(object):
env = relay.Node.Field(EnvNode)
all_envs = DjangoFilterConnectionField(EnvNode)
我尝试添加一个解析查询,但它
def resolve_env(self, info):
env = Env.objects.filter(user = info.context.user.id)
if env is not None:
return env
else:
return None
还尝试按照建议将 class 方法添加到 EnvNode here under filtering Node based ID access:
@classmethod
def get_node(context, cls, id, info):
try:
env = cls._meta.model.objects.get(id = id)
except cls._meta.model.DoesNotExist:
return None
if context.user == env.user:
return env
return None
但是我得到一个错误:
"message": "get_node() missing 1 required positional argument: 'info'",
似乎文档不正确,而且您的参数对于 get_node 方法的顺序也不正确。
调用只有三个参数
- 第一个是你的 DjangoObjectType 子类:EnvNode
- 第二个是 graphql.execution.base.ResolveInfo,其中包含对上下文的引用。您可以从那里获取用户对象。
- 第三个是对象的实际 id。
你应该这样写才能使限制生效:
@classmethod
def get_node(cls, info, id):
try:
env = cls._meta.model.objects.get(id=id, user=info.context.user)
except cls._meta.model.DoesNotExist:
return None
return env
希望对您有所帮助。