带有 graphene-django 的全媒体绝对路径

Full media absolute paths with graphene-django

我目前正在从使用 DRF 切换到 django-graphene,同时将 boto3 和 s3 用于媒体内容。使用 DRF 时,文件字段将返回 s3 存储桶内媒体的完整路径。然而,graphene-django 文件字段只返回相对路径。

例如,使用 DRF 时,文件字段将满 url 返回,例如:

https://bucket.s3.amazonaws.com/logos/logos_2019-11-07_172356.1808000000.png

但是对于 graphene-django,它又回来了:

/logos/logos_2019-11-07_172356.1808000000.png

是否有需要添加的中间件?或者我是否需要创建自己的定标器来处理这个问题?一般来说,我对 graphene-django 和 graphql 很陌生。所以非常感谢任何帮助。

您可以添加自定义字段来构建完整的 URL,如下所示。

class FileType(DjangoObjectType):
    class Meta:
       model = FileModel

    storage_url = graphene.String()

   def resolve_storage_url(self, info):
       return f"https://bucket.s3.amazonaws.com/{self.url}"

然后从前端查询storage_url字段。

正如 Ijharul Islam 提到的,您应该添加一个自定义字段,但是: 要从不同的存储桶中获取 url,甚至从私有对象中获取(您需要一个密钥才能访问该文件),我建议访问模型中包含的字段内的字段“url”文件。

例如:这里我有一个自定义用户模型,在我的模型中有字段“photo_file”:

class UserType(DjangoObjectType):
    class Meta:
        model = get_user_model()
        only_fields = ('id', 'username', 'first_name',
                       'last_name', 'photo_file',)

    def resolve_photo_file(self, info):
        if self.photo_file and self.photo_file.url:
            return f"{self.photo_file.url}"

        else:
            return None