@@ -586,10 +586,68 @@ class LineItemViewSet(viewsets.ModelViewSet):
586
586
587
587
#### HyperlinkedRelatedField
588
588
589
- ` HyperlinkedRelatedField ` has same functionality as ` ResourceRelatedField ` but does
589
+ ` relations. HyperlinkedRelatedField` has same functionality as ` ResourceRelatedField ` but does
590
590
not render ` data ` . Use this in case you only need links of relationships and want to lower payload
591
591
and increase performance.
592
592
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
+
593
651
#### Related urls
594
652
595
653
There is a nice way to handle "related" urls like ` /orders/3/lineitems/ ` or ` /orders/3/customer/ ` .
0 commit comments