django - 如何重新排序 Django-Graphene 子查询?
问题描述
我正在尝试根据我的 ProductLandingpageImage 模型上的“订单”字段重新排序我的 ProductLandingPageImageNode。
如果这将是一个直接查询,我可以编写一个解析方法,但我无法找出这在子查询中是如何实现的。
主要查询:
class Query(graphene.ObjectType):
class Meta:
interfaces = [relay.Node, ]
product_oscar = graphene.List(ProductNode)
productByID = DjangoFilterConnectionField(ProductNode)
def resolve_product_oscar(self, info, **kwargs):
return Product.objects.all()
产品节点:
class ProductNode(DjangoObjectType):
class Meta:
model = Product
interfaces = (relay.Node, )
filter_fields = {
"slug" : ['iexact']
}
PRODUCTLANDINGPAGE图像节点:
class ProductLandingpageImageNode(DjangoObjectType):
class Meta:
model = ProductLandingpageImage
interfaces = (relay.Node, )
如何解决这个问题?
LANDINGPAGEIMAGE 模型应要求提供:
class AbstractProductLandingpageImage(models.Model):
"""
A landingpageimage of a product
"""
product = models.ForeignKey(
'catalogue.Product',
on_delete=models.CASCADE,
related_name='landingpage_image',
verbose_name=_("Product landingpage"))
date_created = models.DateTimeField(_("Date created"), auto_now_add=True)
original = models.ImageField(
_("Landingpage original"), upload_to=settings.OSCAR_IMAGE_FOLDER, max_length=255, blank=True)
ORDER_CHOICES = (
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
)
order = models.PositiveIntegerField(default=1, choices=ORDER_CHOICES, blank=True)
class Meta:
abstract = True
app_label = 'catalogue'
# Any custom models should ensure that this ordering is unchanged, or
# your query count will explode. See AbstractProduct.primary_image.
ordering = ["order"]
verbose_name = _('Product landingpage image')
verbose_name_plural = _('Product landingpage images')
Meta 中的默认排序在某种程度上不起作用。当我对订单值进行 Graphql 查询时,也很奇怪不是不返回“1, 2, 3...”而是“A_1, A_2...”
解决方案
也许是这样的。由于您没有列出您的 Product 模型,我只是在 Product 上编造了引用图像的字段的名称,因此您应该重命名它。如果产品和图像之间存在多对一的关系关系,那么您可能需要不同的字段名称。
import graphene
from graphene.django.types import DjangoObjectType
class ProductNode(DjangoObjectType):
name_of_your_image_field = graphene.Field(ProductLandingpageImageNode)
class Meta:
model = Product
... other Meta data
def resolve_name_of_your_image_field(self, info): # rename to match field
# Put the code that returns a single ProductLandingpageImage instance here
# graphene-django will convert your ProductLandingPageImage instance into a ProductLandingpageImageNode
这是为了返回一个ProductLandingPageIMage
. 如果要返回多个实例,则将字段定义更改为列表
name_of_your_image_field = graphene.List(ProductLandingpageImageNode)
然后在您的解析器中返回多个 ProductLandingPageImage 实例——例如一个按您想要的方式排序的查询集。
推荐阅读
- r - 按降序计算字母频率
- php - How do i post a $_GET variable value using a REQUEST METHOD
- javascript - RTCmulticonnection 使用现有的 getUserMedia 流
- module - 如何动态构建对模块中函数的调用
- asp.net - Visual Studio 2017 在调试单个项目时启动两个 IE 实例
- javascript - 如何在 jQuery 中调用函数
- php - 如何使用 php 和 sql 在单个查询中插入多个数组
- javascript - 如何在警报中显示 console.log 输出
- visual-studio-code - 使用 babel 保留 jsdoc 注释和 VS Code 智能感知
- python - 输出不正确:从 pdf、docx 的 pptx 中提取文本不会在它们自己的 spearte 行中输出