@@ -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
590590not render ` data ` . Use this in case you only need links of relationships and want to lower payload
591591and 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
595653There is a nice way to handle "related" urls like ` /orders/3/lineitems/ ` or ` /orders/3/customer/ ` .
0 commit comments