Skip to content

Commit 4f79464

Browse files
committed
Add docs for SerializerMethodResourceRelatedField
1 parent d2850c4 commit 4f79464

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ any parts of the framework not mentioned in the documentation should generally b
1414

1515
* Avoid `AttributeError` for PUT and PATCH methods when using `APIView`
1616

17+
### Changed
18+
19+
* `SerializerMethodResourceRelatedField` is now consistent with DRF `SerializerMethodField`:
20+
* Pass `method_name` argument to specify method name. If no value is provided, it defaults to `get_{field_name}`
21+
22+
### Deprecated
23+
24+
* Deprecate `source` argument of `SerializerMethodResourceRelatedField`, use `method_name` instead
25+
26+
1727
## [3.1.0] - 2020-02-08
1828

1929
### Added

docs/usage.md

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,10 +586,68 @@ class LineItemViewSet(viewsets.ModelViewSet):
586586

587587
#### HyperlinkedRelatedField
588588

589-
`HyperlinkedRelatedField` has same functionality as `ResourceRelatedField` but does
589+
`relations.HyperlinkedRelatedField` has same functionality as `ResourceRelatedField` but does
590590
not render `data`. Use this in case you only need links of relationships and want to lower payload
591591
and increase performance.
592592

593+
#### SerializerMethodResourceRelatedField
594+
595+
`relations.SerializerMethodResourceRelatedField` combines behaviour of DRF `SerializerMethodField` and
596+
`ResourceRelatedField`, so it accepts `method_name` together with `model` and links-related arguments.
597+
`data` is rendered in `ResourceRelatedField` manner.
598+
599+
```python
600+
from rest_framework_json_api import serializers
601+
from rest_framework_json_api.relations import SerializerMethodResourceRelatedField
602+
603+
from myapp.models import Order, LineItem
604+
605+
606+
class OrderSerializer(serializers.ModelSerializer):
607+
class Meta:
608+
model = Order
609+
610+
line_items = SerializerMethodResourceRelatedField(
611+
model=LineItem,
612+
many=True,
613+
method_name='get_big_line_items'
614+
)
615+
616+
small_line_items = SerializerMethodResourceRelatedField(
617+
model=LineItem,
618+
many=True,
619+
# default to method_name='get_small_line_items'
620+
)
621+
622+
def get_big_line_items(self, instance):
623+
return LineItem.objects.filter(order=instance).filter(amount__gt=1000)
624+
625+
def get_small_line_items(self, instance):
626+
return LineItem.objects.filter(order=instance).filter(amount__lte=1000)
627+
628+
```
629+
630+
or using `related_link_*` with `HyperlinkedModelSerializer`
631+
632+
```python
633+
class OrderSerializer(serializers.HyperlinkedModelSerializer):
634+
class Meta:
635+
model = Order
636+
637+
line_items = SerializerMethodResourceRelatedField(
638+
model=LineItem,
639+
many=True,
640+
method_name='get_big_line_items',
641+
related_link_view_name='order-lineitems-list',
642+
related_link_url_kwarg='order_pk',
643+
)
644+
645+
def get_big_line_items(self, instance):
646+
return LineItem.objects.filter(order=instance).filter(amount__gt=1000)
647+
648+
```
649+
650+
593651
#### Related urls
594652

595653
There is a nice way to handle "related" urls like `/orders/3/lineitems/` or `/orders/3/customer/`.

0 commit comments

Comments
 (0)