将DjangObjectType和ObjectType组合起来

将DjangObjectType和ObjectType组合起来,django,graphql,graphene-python,Django,Graphql,Graphene Python,我有一个简单的django模型,带有一个计算属性字段clicks。模型如下所示: class Link(models.Model): url = models.URLField() @property def clicks(self): """ Property does some calculations and returns a list of dictionaries: """ # removed

我有一个简单的django模型,带有一个计算属性字段
clicks
。模型如下所示:

class Link(models.Model):
    url = models.URLField()

    @property
    def clicks(self):
        """
        Property does some calculations and returns a list of dictionaries:

        """
        # removed calculation for simplicity
        return [{'dt': 1, 'clicks': 100}, {'dt': 2, 'clicks': 201}] 
{
  id: 3,
  url: "www.google.de",
  clicks: [
    dt: 1, clicks: 100},
    dt: 2, clicks: 201}
  ]
}
class LinkType(DjangoObjectType):
    clicks = graphene.List(Stats)

    class Meta:
        model = Link

    def resolve_clicks(self, info):
        return [Stats(dt=click_dict['dt'], clicks=click_dict['clicks') for click_dict in self.clicks]
我想让这个模型在我的graphql端点中可访问。因此,我创建了以下类型和查询:

class Stats(graphene.ObjectType):
    clicks = graphene.String()
    dt = graphene.String()


class LinkType(DjangoObjectType):
    clicks = graphene.List(Stats, source='clicks')

    class Meta:
        model = Link


class Query(object):
    link = graphene.Field(LinkType, id=graphene.Int())

    def resolve_link(self, info, **kwargs):
        id = kwargs.get('id')
        url = kwargs.get('url')
        if id is not None:
            return Link.objects.get(pk=id)
        return None
现在,我应该能够在graphql资源管理器中使用以下查询:

{
  link(id: 3) {
    id,
    url,
    clicks{
      clicks,
      dt
    }
  }
}
我的预期结果如下:

class Link(models.Model):
    url = models.URLField()

    @property
    def clicks(self):
        """
        Property does some calculations and returns a list of dictionaries:

        """
        # removed calculation for simplicity
        return [{'dt': 1, 'clicks': 100}, {'dt': 2, 'clicks': 201}] 
{
  id: 3,
  url: "www.google.de",
  clicks: [
    dt: 1, clicks: 100},
    dt: 2, clicks: 201}
  ]
}
class LinkType(DjangoObjectType):
    clicks = graphene.List(Stats)

    class Meta:
        model = Link

    def resolve_clicks(self, info):
        return [Stats(dt=click_dict['dt'], clicks=click_dict['clicks') for click_dict in self.clicks]
但是
单击
dt
的嵌套值是
null

{
  id: 3,
  url: "www.google.de",
  clicks: [
    dt: null, clicks: null},
    dt: null, clicks: null}
  ]
}
那么我做错了什么?如何将DICT列表转换为graphene中的ObjectType

编辑: 我使用了@mark chackerian answer的修改版本来解决这个问题: 似乎我对石墨烯的“魔力”期望太高了,我必须明确地告诉它每个领域是如何解决的

class Stats(graphene.ObjectType):
    clicks = graphene.String()
    dt = graphene.String()

    def resolve_clicks(self, info):
        return self['clicks']

    def resolve_dt(self, info):
        return self['dt']

您必须更明确地告诉graphene如何制作
Stats
对象列表

试着这样做:

class Link(models.Model):
    url = models.URLField()

    @property
    def clicks(self):
        """
        Property does some calculations and returns a list of dictionaries:

        """
        # removed calculation for simplicity
        return [{'dt': 1, 'clicks': 100}, {'dt': 2, 'clicks': 201}] 
{
  id: 3,
  url: "www.google.de",
  clicks: [
    dt: 1, clicks: 100},
    dt: 2, clicks: 201}
  ]
}
class LinkType(DjangoObjectType):
    clicks = graphene.List(Stats)

    class Meta:
        model = Link

    def resolve_clicks(self, info):
        return [Stats(dt=click_dict['dt'], clicks=click_dict['clicks') for click_dict in self.clicks]