Adding the code:

class EventHyperlink(serializers.HyperlinkedRelatedField):

view_name = 'content_endpoints:event-detail'
queryset = Event.objects.all()

def get_url(self, obj, view_name, request, format):

    published_object = obj.get_published()  # get the published version of the 
object

    if not published_object:  # draft object was not published
        primary_key = FAKE_PRIMARY_KEY
    else:
        primary_key = published_object.pk

    url_kwargs = {
        'pk': primary_key
    }

    return reverse(view_name, kwargs=url_kwargs, request=request, format=format)

def get_object(self, view_name, view_args, view_kwargs):
    lookup_kwargs = {
        'pk': view_kwargs['pk']
    }
    return self.get_queryset().get(**lookup_kwargs)

def to_representation(self, *args, **kwargs):
    this = 'that'

class BaseSerializer(serializers.HyperlinkedModelSerializer):

layout = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:layout-detail',
    many=False,
    read_only=True
)
polymorphic_ctype = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:contenttype-detail',
    many=False,
    read_only=True)
slug = CleanedSlugField()
category = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:category-detail',
    many=False,
    read_only=True)
location = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:location-detail',
    many=False,
    read_only=True)
image = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:image-detail',
    many=False,
    read_only=True)

starts = serializers.SerializerMethodField()
ends = serializers.SerializerMethodField()
absolute_url = serializers.SerializerMethodField()

def get_starts(self, obj):
    return obj.get_starts()

def get_ends(self, obj):
    return obj.get_ends()

def get_absolute_url(self, obj):
    cleaned_slug = obj.slug.rstrip('$')
    protocol = 
self.context['request']._request.META['SERVER_PROTOCOL'].split('/')
    host = self.context['request']._request.META['HTTP_HOST']
    path = app_reverse('event-detail', args=(cleaned_slug,))
    return protocol[0] + '://' + host + path

class ExhibitionAndProgramContentSerializer(BaseSerializer):

hero_image = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:image-detail',
    many=False,
    read_only=True
)
hero_video = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:video-detail',
    many=False,
    read_only=True
)

events = EventHyperlink(
    many=True,
    required=False,
    allow_null=True,
)
#events = serializers.HyperlinkedRelatedField(
#    view_name='content_endpoints:event-detail',
#    source='events.published',
#    many=True,
#    read_only=True,
#    allow_null=True,
#)
programs = ProgramHyperlink(many=True)
#programs = serializers.HyperlinkedRelatedField(
#    view_name='content_endpoints:program-detail',
#    source='programs.published',
#    many=True,
#    read_only=True,
#    allow_null = True,
#)

content_header = serializers.SerializerMethodField()
content_sponsor = serializers.SerializerMethodField()
content_event_main = serializers.SerializerMethodField()

def get_content_header(self, obj):
    serializer = ContentSerializer(
        instance=obj.contentitem_set.filter(placeholder__title='Header'),
        many=True,
        context=self.context,
    )
    return serializer.data

def get_content_sponsor(self, obj):
    serializer = ContentSerializer(
        instance=obj.contentitem_set.filter(placeholder__title='Sponsors'),
        many=True,
        context=self.context,
    )
    return serializer.data

def get_content_event_main(self, obj):
    serializer = ContentSerializer(
        instance=obj.contentitem_set.filter(placeholder__title='Event-Main'),
        many=True,
        context=self.context,
    )
    return serializer.data

class EventSerializer(BaseSerializer):

url = serializers.HyperlinkedIdentityField(
    view_name='content_endpoints:event-detail',
)

exhibitions = ExhibitionHyperlink(
    many=True,
)
#exhibitions = serializers.HyperlinkedRelatedField(
#    view_name='content_endpoints:exhibition-detail',
#    source='exhibitions.published',
#    many=True,
#    read_only=True,
#    allow_null=True,
#)
programs = ProgramHyperlink(many=True)
#programs = serializers.HyperlinkedRelatedField(
#    view_name='content_endpoints:program-detail',
#    source='programs.published',
#    many=True,
#    read_only=True,
#    allow_null=True,
#)
slide_show = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:slideshow-detail',
    source='slide_show.published',
    many=False,
    read_only=True
)

content_info = serializers.SerializerMethodField()
content_sponsor = serializers.SerializerMethodField()

class Meta:
    model = Event
    fields = '__all__'

def get_content_info(self, obj):
    serializer = ContentSerializer(
        instance=obj.contentitem_set.filter(placeholder__title='Event 
Information'),
        many=True,
        context=self.context,
    )
    return serializer.data

def get_content_sponsor(self, obj):
    serializer = ContentSerializer(
        instance=obj.contentitem_set.filter(placeholder__title='Sponsors'),
        many=True,
        context=self.context,
    )
    return serializer.data

class EventViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Event.objects.all().order_by('created')
serializer_class = EventSerializer
pagination_class = PageNumberPagination

def get_queryset(self):
    return self.queryset.published()

class ExhibitionSerializer(ExhibitionAndProgramContentSerializer):

url = serializers.HyperlinkedIdentityField(
    view_name='content_endpoints:exhibition-detail',
)

department = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:department-detail',
    many=True,
    read_only=True
)
press_release = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:pressrelease-detail',
    source='press_release.published',
    many=False,
    read_only=True
)
image_press_override = serializers.HyperlinkedRelatedField(
    view_name='content_endpoints:image-detail',
    many=False,
    read_only=True
)

class Meta:
    model = Exhibition
    fields = '__all__'

class ExhibitionViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Exhibition.objects.all().order_by('created')
serializer_class = ExhibitionSerializer
pagination_class = PageNumberPagination

def get_queryset(self):
    return self.queryset.published()

class ProgramSerializer(ExhibitionAndProgramContentSerializer):

url = serializers.HyperlinkedIdentityField(
    view_name='content_endpoints:program-detail',
)

exhibitions = ExhibitionHyperlink(many=True)
#exhibitions = serializers.HyperlinkedRelatedField(
#    view_name='content_endpoints:exhibition-detail',
#    source='exhibitions.published',
#    many=True,
#    read_only=True,
#    allow_null=True,
#)

class Meta:
    model = Program
    fields = '__all__'

class ProgramViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Program.objects.all().order_by('created')
serializer_class = ProgramSerializer
pagination_class = MicroPagination

def get_queryset(self):
    published_qs = self.queryset.published()
    return published_qs

`

On Tuesday, March 6, 2018 at 4:30:45 PM UTC-8, Amber Diehl wrote:
>
> Hi,
>
> I have not posted all the objects involved with this as that would make 
> for a lot of code. If needed will provide. 
>
> I am trying to serialize an object using a custom defined 
> HyperlinkRelatedField. The subclass is required to get the correct object 
> to link to--class contains two objects for each item, a "Draft" object, and 
> the "Published" object. 
>
> For example, the base model: 
>
> PK    Object               Status        Slug
> 1       EventSeries A   Draft          eventseries-a
> 14     EventSeries A   Published  eventseries-a
> 2       EventSeries B   Draft          eventseries-b
> 22     EventSeries B   Published  eventseries-b
>
> By default the "draft" event is returned, so this initial override is done 
> in get_queryset method.
>
> However, for each Event Series there can be 0, n related Event objects 
> which also have a draft and published version. 
>
> These are related to the EventSeries model using a custom 
> HyperlinkedRelatedField. This enables me to use the get_object method to 
> return the published object instead of the draft.
>
> This works perfectly as long as there are associated Event objects. When 
> there are none, I am getting the error Cannot resolve URL for hyperlinked 
> relationship...
>
> I have tried adding allow_null=True, allow_blank=True to the custom 
> HyperlinkedRelatedField but neither help. 
>
> Alternatively, is there a way to override the to_representation method in 
> relations.py/HyperlinkedRelatedField?
>
> Thanks in advance for your help.
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-rest-framework+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to