Return 针对 django 石墨烯上的 graphql 查询的注释查询集
Return annotated queryset against graphql queries on django graphene
class Project(models.Model):
name = models.CharField(max_length=189)
class Customer(models.Model):
name = models.CharField(max_length=189)
is_deleted = models.BooleanField(default=False)
project = models.ForeignKey(Project, related_name="customers")
class Message(models.Model):
message = models.TextField()
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name="messages")
created_at = models.DateTimeField(auto_now_add=True)
我正在使用以下查询集来获取某个项目下的所有客户,这些客户是由最后发送消息的人订购的。
qs = Customer.objects.filter(messages__isnull=False) \
.annotate(last_message=Max('messages__created_at')).order_by('-last_message')
现在我想使用一个基本的石墨烯查询(不是中继)来根据带注释的查询集获取一个项目以及与该项目关联的客户。
我可能还有第二个用例,我需要根据客户 table 中的字段过滤 project.customers.all() 查询集(例如,具有 is_deleted=False 的客户) .
目前在我的 graphql 模式中,
class ProjectNode(DjangoObjectType):
class Meta:
model = Project
class CustomerNode(DjangoObjectType):
class Meta:
model = Customer
class Query(graphene.ObjectType):
project = graphene.Field(ProjectNode, id=graphene.Int(), token=graphene.String(), )
top_chat_customers = graphene.Field(CustomerNode, project_id=graphene.Int())
def resolve_project(self, info, **kwargs):
pk = kwargs["id"]
return Project.objects.filter(id=pk).first()
def resolve_top_chat_customers(self, info, **kwargs):
project = Project.objects.filter(id=kwargs["project_id"]).first()
return Customer.objects.filter(project=project, messages__isnull=False) \
.annotate(last_message=Max('messages__created_at')).order_by('-last_message')
在这里,当我尝试通过提供项目 ID 单独获取客户列表时,它显示错误:"Received incompatible instance..."
关于如何从项目节点中获取客户列表并作为单独的 top_chat_customers 查询有什么想法吗?
感谢任何帮助。谢谢!
方法 resolve_top_chat_customers
returns 一个可迭代的查询集,而不是一个单独的 Customer
对象,所以在 Query
中你需要指定你要返回一个列表:
top_chat_customers = graphene.List(CustomerNode, project_id=graphene.Int())
此外,查询中的任何带注释的字段都不会自动成为架构的一部分。如果你想看到它们,你需要明确地添加它们:
class CustomerNode(DjangoObjectType):
last_message = graphene.String()
class Meta:
model = Customer
def resolve_last_message(self, info):
# Returns last message only if the object was annotated
return getattr(self, 'last_message', None)
class Project(models.Model):
name = models.CharField(max_length=189)
class Customer(models.Model):
name = models.CharField(max_length=189)
is_deleted = models.BooleanField(default=False)
project = models.ForeignKey(Project, related_name="customers")
class Message(models.Model):
message = models.TextField()
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name="messages")
created_at = models.DateTimeField(auto_now_add=True)
我正在使用以下查询集来获取某个项目下的所有客户,这些客户是由最后发送消息的人订购的。
qs = Customer.objects.filter(messages__isnull=False) \
.annotate(last_message=Max('messages__created_at')).order_by('-last_message')
现在我想使用一个基本的石墨烯查询(不是中继)来根据带注释的查询集获取一个项目以及与该项目关联的客户。 我可能还有第二个用例,我需要根据客户 table 中的字段过滤 project.customers.all() 查询集(例如,具有 is_deleted=False 的客户) .
目前在我的 graphql 模式中,
class ProjectNode(DjangoObjectType):
class Meta:
model = Project
class CustomerNode(DjangoObjectType):
class Meta:
model = Customer
class Query(graphene.ObjectType):
project = graphene.Field(ProjectNode, id=graphene.Int(), token=graphene.String(), )
top_chat_customers = graphene.Field(CustomerNode, project_id=graphene.Int())
def resolve_project(self, info, **kwargs):
pk = kwargs["id"]
return Project.objects.filter(id=pk).first()
def resolve_top_chat_customers(self, info, **kwargs):
project = Project.objects.filter(id=kwargs["project_id"]).first()
return Customer.objects.filter(project=project, messages__isnull=False) \
.annotate(last_message=Max('messages__created_at')).order_by('-last_message')
在这里,当我尝试通过提供项目 ID 单独获取客户列表时,它显示错误:"Received incompatible instance..."
关于如何从项目节点中获取客户列表并作为单独的 top_chat_customers 查询有什么想法吗?
感谢任何帮助。谢谢!
方法 resolve_top_chat_customers
returns 一个可迭代的查询集,而不是一个单独的 Customer
对象,所以在 Query
中你需要指定你要返回一个列表:
top_chat_customers = graphene.List(CustomerNode, project_id=graphene.Int())
此外,查询中的任何带注释的字段都不会自动成为架构的一部分。如果你想看到它们,你需要明确地添加它们:
class CustomerNode(DjangoObjectType):
last_message = graphene.String()
class Meta:
model = Customer
def resolve_last_message(self, info):
# Returns last message only if the object was annotated
return getattr(self, 'last_message', None)