如何重新排序 Django-Graphene 子查询?

Posted

技术标签:

【中文标题】如何重新排序 Django-Graphene 子查询?【英文标题】:How to reorder Django-Graphene sub-query? 【发布时间】:2019-03-03 14:12:30 【问题描述】:

我正在尝试根据我的 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']
    

PRODUCTLANDINGPAGEIMAGENODE:

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...”

【问题讨论】:

你没有显示你的模型,但我猜你想在你的 ProductNode 中为你的 ProductLandingpageImage 模型创建一个明确的解析器,它有你想要的顺序,而不是使用默认的解析由 DjangoObjectType 创建的方法。 感谢您的回答。这正是我所需要的。 @MarkChackerian 你能告诉我如何写一个显式解析器吗? 【参考方案1】:

也许是这样的。由于您没有列出您的 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 实例——例如一个按您想要的方式排序的查询集。

【讨论】:

以上是关于如何重新排序 Django-Graphene 子查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套结构的参数使用 django-graphene 过滤父级

Django-Graphene: 没有名为'graphql_jwt'的模块。

重新排序包含目录如何解决宏重新定义问题?

LongPress on List 确实在 iPad 上重新排序,但如何在 iPhone 上重新排序

如何在 Swift 3 中重新排序核心数据对象数组并重新排序它的 Int 属性

如何在 UITests 下重新排序单元格?