Как мы можем сделать фильтрованный запрос в schema.py в проекте graphene- django без использования функции ретрансляции? - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в фоновом программировании, особенно в графене- django. Мой вопрос: как мы можем создать отфильтрованный запрос в schema.py в проекте graphene- django без использования функции ретрансляции? Я видел это раньше, но я не хочу использовать функцию ретрансляции. а не я хочу использовать фильтр, но я не знаю как ?? теперь мои models.py и schema.py выглядят так:

* models.py

# shoes_store/ingredients/models.py
from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=50)
    notes = models.TextField(default='')

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=300)
    descreption = models.TextField(default='')
    price = models.CharField(max_length=50, default='')
    imageURL = models.TextField(default='')
    category= models.ForeignKey(Category,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

и schema.py:

import graphene
from graphene_django.types import DjangoObjectType
from shoes_store.ingredients.models import Category, Product

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category

class ProductType(DjangoObjectType):
    class Meta:
        model = Product


class Query:
    #===========================
    # product
    products = graphene.List(ProductType)
    product = graphene.Field(ProductType,product_id=graphene.ID())    

    def resolve_products(self, info, **kwargs):
        # Querying a list
        return Product.objects.all()

    def resolve_product(self, info, product_id):
        # Querying a single user
        return Product.objects.get(pk=product_id)


    #===========================
    # product_category
    categories = graphene.List(CategoryType)
    category = graphene.Field(CategoryType,category_id=graphene.ID())    

    def resolve_categories(self, info, **kwargs):
        # Querying a list
        return Category.objects.all()

    def resolve_category(self, info, category_id):
        # Querying a single user
        return Category.objects.get(pk=category_id)

1 Ответ

0 голосов
/ 12 апреля 2020

лучшее решение выглядит как это , если вы не хотите использовать Relay.

вы можете изменить свой schema.py так:

import graphene
from graphene_django.types import DjangoObjectType
from shoes_store.ingredients.models import Category, Product
from django.db.models import Q


class CategoryType(DjangoObjectType):
    class Meta:
        model = Category

class ProductType(DjangoObjectType):
    class Meta:
        model = Product


class Query:
    #===========================
    # product
    products = graphene.List(ProductType,name=graphene.String(),category_id=graphene.ID())
    product = graphene.Field(ProductType,product_id=graphene.ID())    

    def resolve_products(self, info, name=None,category_id=None, **kwargs):
        # Querying a list
        if name:
            filter = (
                Q(name__icontains=name) |
                Q(descreption__icontains=name)
            )
            return Product.objects.filter(filter)
        #
        if category_id:
            filter = (
                Q(category_id__exact=category_id)
            )
            return Product.objects.filter(filter)
        #
        return Product.objects.all()

    def resolve_product(self, info, product_id):
        # Querying a single user
        return Product.objects.get(pk=product_id)


    #===========================
    # product_category
    categories = graphene.List(CategoryType)
    category = graphene.Field(CategoryType,category_id=graphene.ID())    

    def resolve_categories(self, info, **kwargs):
        # Querying a list
        return Category.objects.all()

    def resolve_category(self, info, category_id):
        # Querying a single user
        return Category.objects.get(pk=category_id)

теперь вы можете использовать разные запросы в вашем адресе "http://127.0.0.1: 8000 / graphql ". Например, вы можете использовать:

query{
    products{
     id
     name
     price
  }
}

или даже:

query{
    products(categoryId:1){
     id
     name
     price
  }
}

или

query{
    products(name:"Men's boots"){
     id
     name
     price
  }
}
...