Skip to content

There's some way to set the source field param for nested fields? #1439

Open
@alexcmgit

Description

@alexcmgit

Context

I'm currently trying to set my model user User subfield user.actor.id as field source of my DjangoObjectType.

This happens because there's other kind of users within the application like an Organization or even a Bot (all of them are actors).

Example

Lets define a custom Type:

class User(DjangoObjectType):
    class Meta:
        model = UserModel
        exclude = ['actor']
        filter_fields = ['actor__login']
        interfaces = [graphene.relay.Node]
        skip_registry = True

    # The login field is originated from `actor` relationship, not from the user model itself.
    # It doesn't work, actor__login is interpreted as user field [user.actor__login] not [user.actor.login].
    login = graphene.Field(graphene.String, source='actor__login')
    # ...

In the example above I define the login field source as source='actor__login' but I saw that here we're using getattr function to resolve the source so it's currently impossible to set the field without defining a custom resolver.

def source_resolver(source, root, info, **args):
resolved = default_resolver(source, None, root, info, **args)
if inspect.isfunction(resolved) or inspect.ismethod(resolved):
return resolved()
return resolved

I would like to know if there's an alternative solution to select a subfield like the example or we're forced to create a custom resolver by using the resolver=lambda _, __: ... arg or the class method declaration.

Thanks for the hard work and the library!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions