Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Please Add Further Support for FastAPI or Pydantic ObjectTypes

未关闭
#1,320 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
20/100
Issue 类型
功能
描述清晰度
需要澄清
活跃度
停滞
技术栈
fastapi, python

调研方向

该示例涉及 graphql/mutations.py、graphql/types.py、graphql/queries.py 和 models/customers.py,并使用 TortoiseORM 的 pydantic_model_creator;首先跟踪 Graphene ObjectTypes 和 mutation 参数当前是如何声明的。在提出实现方案之前,先定义所支持的 FastAPI/Pydantic 集成及其完成标准,因为该 issue 没有指定目标入口点或测试。

由索引模型根据 Issue 内容生成。

描述

✨ enhancement

I want to avoid repeating code fragments between the mutations and types with graphene in a FastAPI app.

Not a very polished example but please see below sample scenario.

graphql\mutations.py

import graphene

from models.customers import CustomerLogin,  CustomerLogin_PydanticIn
from graphql.types import CustomerLoginType


class CreateUserMutation(graphene.Mutation):
    class Arguments:
        id = graphene.Int()
        shard_id = graphene.Decimal()
        seq_num = graphene.Decimal()
        event_timedate = graphene.DateTime()
        user_id = graphene.UUID()
        device_token = graphene.UUID()
        user_ip = graphene.String()
        user_agent = graphene.String()
        client_id = graphene.String()
        process = graphene.String()
        auth_result = graphene.String()
        auth_fail_cause = graphene.String()
        plain_email = graphene.String()

    user = graphene.Field(CustomerLoginType)

    @staticmethod
    async def mutate(parent, info, user: CustomerLogin_PydanticIn):
        user = await CustomerLogin.create(**user.dict())
        return CreateUserMutation(user=user)

graphql\types.py

import graphene


# Fields should coincide with model.CustomerLogin
class CustomerLoginType(graphene.ObjectType):
    id = graphene.Int()
    shard_id = graphene.Decimal()
    seq_num = graphene.Decimal()
    event_timedate = graphene.DateTime()
    user_id = graphene.UUID()
    device_token = graphene.UUID()
    user_ip = graphene.String()
    user_agent = graphene.String()
    client_id = graphene.String()
    process = graphene.String()
    auth_result = graphene.String()
    auth_fail_cause = graphene.String()
    plain_email = graphene.String()

graphql\queries.py

import graphene

from models.customers import CustomerLogin
from graphql.types import CustomerLoginType


class Query(graphene.ObjectType):

    all_customer_logins = graphene.List(CustomerLoginType)
    single_customer_login = graphene.Field(CustomerLoginType, id=graphene.Int())

    @staticmethod
    async def resolve_all_customer_logins(parent, info):
        users = await CustomerLogin.all()
        return users

    @staticmethod
    async def resolve_single_customer_login(parent, info, id):
        user = await CustomerLogin.get(id=id)
        return user

Then the ORM model using TortoiseORM

models\customers.py

from tortoise import fields
from tortoise.contrib.pydantic import pydantic_model_creator
from tortoise.models import Model

from models.events import ShardID, SequenceNum


class CustomerLogin(Model):
    shard_id: fields.ForeignKeyNullableRelation[ShardID] = \
        fields.ForeignKeyField(model_name='models.ShardID',
                               related_name='customerlogin_shardid',
                               to_field='shard_id',
                               on_delete=fields.RESTRICT,
                               null=True)
    seq_num: fields.ForeignKeyNullableRelation[SequenceNum] = \
        fields.ForeignKeyField(model_name='models.SequenceNum',
                               related_name='customerlogin_seqnum',
                               to_field='seq_num',
                               on_delete=fields.RESTRICT,
                               null=True)
    event_timedate = fields.DatetimeField(null=True)
    user_id = fields.UUIDField(null=True)
    device_token = fields.UUIDField(null=True)
    user_ip = fields.CharField(256, null=True)
    user_agent = fields.CharField(1024, null=True)
    client_id = fields.CharField(256, null=True)
    process = fields.CharField(256, null=True)
    auth_result = fields.CharField(256, null=True)
    auth_fail_cause = fields.CharField(256, null=True)
    plain_email = fields.CharField(256, null=True)


CustomerLogin_Pydantic = pydantic_model_creator(CustomerLogin, name='CustomerLogin')
CustomerLogin_PydanticIn = pydantic_model_creator(CustomerLogin, name='CustomerLoginIn', exclude_readonly=True)
主要语言
Python
星标
8.2k
派生
818
PR 合并指标
30 天内没有已合并 PR

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

graphql-python/graphene 的其他 Issue

查看 graphql-python/graphene 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。