Graphene 和 Django 关于关系
Graphene and Django about relationships
我对 Graphene 很陌生,正在测试它是否可以将它用于具有复杂查询的 Django 项目。为了测试它,我正在尝试使用以下模型创建电子商务
class Sku(models.Model):
name = models.CharField(max_length=100)
class Product(models.Model):
name = models.CharField(max_length=100)
class ProductSku(models.Model):
sku = models.ForeignKey(Sku, related_name='product_sku', on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name='product_sku', on_delete=models.CASCADE)
price = models.IntegerField()
正如您在此处看到的,Product 和 Sku 使用模型 ProductSku
存在多对多关系
使用 Graphene 的文档,我创建了以下架构
class SkuNode(DjangoObjectType):
class Meta:
model = Sku
class ProductNode(DjangoObjectType):
class Meta:
model = Product
class ProductSkuNode(DjangoObjectType):
class Meta:
model = ProductSku
class Query(graphene.ObjectType):
all_products = graphene.List(ProductNode, name=graphene.String())
product = graphene.Field(ProductNode, id=graphene.Int())
def resolve_all_products(self, info, **args):
name = args.get('name')
if name is not None:
return Product.objects.filter(name__icontains=name)
return Product.objects.all()
def resolve_product(self, info, **args):
id = args.get('id')
if id is not None:
return Product.objects.filter(pk=id).first()
现在我的前端应用程序可以通过查询
来获取给定 sku 的给定产品的价格
query{
allProducts{
id,
name,
productSku{
price,
sku{
id,
name
}
}
}
}
但我想做的是查询 SkuNode 内的价格
query{
allProducts{
id,
name,
sku{
id,
name,
price
}
}
}
这可能吗?
您可以向 ProductNode
添加 sku 字段和解析器,例如:
class ProductNode(DjangoObjectType):
sku = graphene.Field(SkuNode)
class Meta:
model = Product
def resolve_sku(self, info):
return self.product_sku.sku # (however you get the Sku object from a Product instance)
然后您将有一个 sku
字段作为产品响应的一部分。但是由于您要求的是混合来自 Sku
和 ProductSku
模型的字段,您最好创建一个不是模型类型的新对象类型,它只是一个 ObjectType
有 3 个字段(id、名称、价格),然后动态返回它的一个实例。因此,在那种情况下,您应该为 ProductNode
执行此操作
class ProductNode(DjangoObjectType):
sku = graphene.Field(SkuObjectType)
class Meta:
model = Product
def resolve_sku(self, info):
sku = self.product_sku.sku
return SkuObjectType(id=sku.id, name=sku.name, price=self.product_sky.price)
然后你会创建SkuObjectType
喜欢
class SkuNode(DjangoObjectType):
id = graphene.ID()
name = graphene.String()
price = graphene.Int()
我对 Graphene 很陌生,正在测试它是否可以将它用于具有复杂查询的 Django 项目。为了测试它,我正在尝试使用以下模型创建电子商务
class Sku(models.Model):
name = models.CharField(max_length=100)
class Product(models.Model):
name = models.CharField(max_length=100)
class ProductSku(models.Model):
sku = models.ForeignKey(Sku, related_name='product_sku', on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name='product_sku', on_delete=models.CASCADE)
price = models.IntegerField()
正如您在此处看到的,Product 和 Sku 使用模型 ProductSku
存在多对多关系使用 Graphene 的文档,我创建了以下架构
class SkuNode(DjangoObjectType):
class Meta:
model = Sku
class ProductNode(DjangoObjectType):
class Meta:
model = Product
class ProductSkuNode(DjangoObjectType):
class Meta:
model = ProductSku
class Query(graphene.ObjectType):
all_products = graphene.List(ProductNode, name=graphene.String())
product = graphene.Field(ProductNode, id=graphene.Int())
def resolve_all_products(self, info, **args):
name = args.get('name')
if name is not None:
return Product.objects.filter(name__icontains=name)
return Product.objects.all()
def resolve_product(self, info, **args):
id = args.get('id')
if id is not None:
return Product.objects.filter(pk=id).first()
现在我的前端应用程序可以通过查询
来获取给定 sku 的给定产品的价格query{
allProducts{
id,
name,
productSku{
price,
sku{
id,
name
}
}
}
}
但我想做的是查询 SkuNode 内的价格
query{
allProducts{
id,
name,
sku{
id,
name,
price
}
}
}
这可能吗?
您可以向 ProductNode
添加 sku 字段和解析器,例如:
class ProductNode(DjangoObjectType):
sku = graphene.Field(SkuNode)
class Meta:
model = Product
def resolve_sku(self, info):
return self.product_sku.sku # (however you get the Sku object from a Product instance)
然后您将有一个 sku
字段作为产品响应的一部分。但是由于您要求的是混合来自 Sku
和 ProductSku
模型的字段,您最好创建一个不是模型类型的新对象类型,它只是一个 ObjectType
有 3 个字段(id、名称、价格),然后动态返回它的一个实例。因此,在那种情况下,您应该为 ProductNode
class ProductNode(DjangoObjectType):
sku = graphene.Field(SkuObjectType)
class Meta:
model = Product
def resolve_sku(self, info):
sku = self.product_sku.sku
return SkuObjectType(id=sku.id, name=sku.name, price=self.product_sky.price)
然后你会创建SkuObjectType
喜欢
class SkuNode(DjangoObjectType):
id = graphene.ID()
name = graphene.String()
price = graphene.Int()