石墨烯和 Django 关于关系

Posted

技术标签:

【中文标题】石墨烯和 Django 关于关系【英文标题】:Graphene and Django about relationships 【发布时间】:2019-05-03 02:26:41 【问题描述】:

我对 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()

正如您在此处看到的,使用 ProductSku 模型,Product 和 Sku 具有多对多关系

使用 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
    
  

这可能吗?

【问题讨论】:

感觉SKU一开始就不应该是自己的模型。这只是产品的一个属性。 【参考方案1】:

您可以向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 字段作为产品响应的一部分。但是由于您要求的是混合来自 SkuProductSku 模型的字段,因此您最好创建一个不是模型类型的新对象类型,它只是一个 ObjectType 和 3字段(id,name,price),然后动态返回一个实例。因此,在这种情况下,您应该为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()

【讨论】:

以上是关于石墨烯和 Django 关于关系的主要内容,如果未能解决你的问题,请参考以下文章

石墨烯和 SQLAlchemy:派生自基础对象类型

如何将 pyspark、石墨烯和烧瓶结合在一起?

如何解决具有多对多关系的石墨烯 django 节点字段

具有外键关系的对象的石墨烯中的 GraphQL 突变

有没有办法让石墨烯与 django GenericRelation 字段一起工作?

Django 石墨烯中继限制对用户拥有的对象的查询