graphql-python / graphql-python/graphene

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

Đang mở
#1,439 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Python
Star
8.2k
Fork
818
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

## 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`:

```py
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](https://github.com/graphql-python/graphene/blob/dfece7f65d4bad51a87a8e9f03f9acef1e25d3f8/graphene/types/field.py#L16-L20) we're using `getattr` function to resolve the source so it's currently impossible to set the field without defining a custom resolver.

https://github.com/graphql-python/graphene/blob/dfece7f65d4bad51a87a8e9f03f9acef1e25d3f8/graphene/types/field.py#L16-L20

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!

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Start with graphene/types/field.py at the referenced source-resolution code and trace how DjangoObjectType fields use the source value. Compare the `actor__login` example with the current custom-resolver alternative; done means the intended nested relationship behavior is supported or the limitation and expected resolver approach are documented.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
api, backend
Loại issue
Tính năng
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.