将 json 模型字段与 django 石墨烯一起使用

Posted

技术标签:

【中文标题】将 json 模型字段与 django 石墨烯一起使用【英文标题】:Using json model field with django graphene 【发布时间】:2018-12-06 11:46:56 【问题描述】:

我正在为我的项目使用 graphql 端点。其中一个模型具有包含一些 json 的文本字段。如果我通过 graphql 请求我的实体列表,我会像字符串一样得到这个 json。如何在 graphql 中将其作为嵌套结构使用,并具有过滤、选择某些属性等能力。

class SysObjects(models.Model):
    id = models.BigAutoField(primary_key=True)
    user_id = models.BigIntegerField()
    type_id = models.PositiveIntegerField(blank=True, null=True)
    # status = models.ForeignKey('SysObjectsStatuses', models.DO_NOTHING, blank=True, null=True)
    title = models.CharField(max_length=255, blank=True, null=True)
    data = models.TextField(blank=True, null=True) #json string is here
    visible = models.IntegerField()
    date_actual = models.DateTimeField()
    date_update = models.DateTimeField(blank=True, null=True)
    date_add = models.DateTimeField(blank=True, null=True)
    orig = models.CharField(max_length=255, blank=True, null=True)
    is_color = models.PositiveIntegerField()

    class Meta:
        managed = False
        db_table = 'sys_objects'
        app_label = "default"

    def __str__(self):
        return self.title

【问题讨论】:

【参考方案1】:

您可以为具有自定义类型的数据字段声明解析器,例如

import graphene
from graphene.django.types import DjangoObjectType

class SysObjectsType(DjangoObjectType):
    data = DataType()

    class Meta:
        model = SysObjects

    def resolve_data(self, info):
        # What you return here depends on how you are unpacking the JSON data
        return self.data

class DataType(graphene.ObjectType):
    # What you put here depends on how you want to structure the JSON output
    ...

您或许可以将这个想法扩展为 DataType 数据以返回 DataType 数据,从而能够处理任意深度的数据树。

【讨论】:

以上是关于将 json 模型字段与 django 石墨烯一起使用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让石墨烯与 django GenericRelation 字段一起工作?

如何解决具有多对多关系的石墨烯 django 节点字段

如何使用石墨烯-django 对多个字段中的图标使用 OR 条件

石墨烯和 Django 关于关系

Django 模型对象和石墨烯 get_node

石墨烯 Django 和 react-router-relay