Графен и Джанго об отношениях - PullRequest
0 голосов
/ 01 декабря 2018

Я очень новичок в Graphene и проверяю, могу ли я использовать его для проекта Django со сложными запросами.Чтобы проверить это, я пытаюсь создать Ecommerce со следующими моделями

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
      }
    }
  }
}
* 1011.* Но я хочу сделать запрос, запрашивающий цену внутри SkuNode
query{
  allProducts{
    id,
    name,
    sku{
      id,
      name,
      price
    }
  }
}

Это возможно?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете добавить поле sku и распознаватель к ProductNode, например:

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поля (идентификатор, имя, цена), а затем динамически возвращать экземпляр этого.Так что в этом случае вы должны сделать это для 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()
...