我们如何在不使用中继功能的情况下在graphene-django项目的schema.py中进行过滤查询? [英] How we can make filtered query in schema.py in graphene-django project without using Relay feature?
问题描述
我是后端编程的新手,尤其是在石墨烯-django中.我的问题是如何在不使用中继功能的情况下在graphene-django项目的schema.py中创建过滤查询?我以前见过此,但我没有要使用中继功能.而不是我想使用过滤器,但我不知道怎么做?现在我的models.py和schema.py看起来像这样:
I am new to back-end programming especially in graphene-django. my question is how can we create filtered query in schema.py in graphene-django project without using Relay feature? i saw this before but i don't want to use Relay feature. rather than i want use a filter, but i don't know how?? now my models.py and schema.py look-like these:
* models.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:
and 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)
推荐答案
the best solution is look-like this if you don't want use Relay.
您可以更改您的schema.py,类似于:
you can change your schema.py similar to:
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"地址.例如,您可以使用:
now you can use different queries in your "http://127.0.0.1:8000/graphql" address. fore example you can use:
query{
products{
id
name
price
}
}
甚至:
query{
products(categoryId:1){
id
name
price
}
}
或
query{
products(name:"Men's boots"){
id
name
price
}
}
这篇关于我们如何在不使用中继功能的情况下在graphene-django项目的schema.py中进行过滤查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!