diff --git a/program/serializers.py b/program/serializers.py
index 690b42a0e252cf06fa543367eae3fe71caff260e..bf44de1c521d6b280208824988558ffc0c3e9532 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -83,16 +83,18 @@ class ErrorSerializer(serializers.Serializer):
 
 
 class ProfileSerializer(serializers.ModelSerializer):
+    user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source="user")
+
     class Meta:
         model = UserProfile
         fields = (
-            "user",
             "cba_username",
             "cba_user_token",
             "created_at",
             "created_by",
             "updated_at",
             "updated_by",
+            "user_id",
         )
         read_only_fields = (
             "created_at",
@@ -281,10 +283,8 @@ class ImageSerializer(serializers.ModelSerializer):
 
 
 class HostSerializer(serializers.ModelSerializer):
-    image = serializers.PrimaryKeyRelatedField(
-        allow_null=True,
-        queryset=Image.objects.all(),
-        required=False,
+    image_id = serializers.PrimaryKeyRelatedField(
+        allow_null=True, queryset=Image.objects.all(), required=False, source="image"
     )
     links = HostLinkSerializer(many=True, required=False)
 
@@ -300,7 +300,7 @@ class HostSerializer(serializers.ModelSerializer):
             "biography",
             "email",
             "id",
-            "image",
+            "image_id",
             "is_active",
             "links",
             "name",
@@ -313,6 +313,8 @@ class HostSerializer(serializers.ModelSerializer):
 
         links_data = validated_data.pop("links", [])
 
+        validated_data["image"] = validated_data.pop("image_id", None)
+
         host = Host.objects.create(
             created_by=self.context.get("request").user.username, **validated_data
         )
@@ -331,7 +333,7 @@ class HostSerializer(serializers.ModelSerializer):
 
         instance.biography = validated_data.get("biography", instance.biography)
         instance.email = validated_data.get("email", instance.email)
-        instance.image = validated_data.get("image", instance.image)
+        instance.image = validated_data.get("image_id", instance.image)
         instance.is_active = validated_data.get("is_active", instance.is_active)
         instance.name = validated_data.get("name", instance.name)
 
@@ -643,7 +645,7 @@ class CollisionSerializer(serializers.Serializer):
     playlist_id = serializers.IntegerField(allow_null=True)
     show_id = serializers.IntegerField()
     show_name = serializers.CharField()
-    repetition_of = serializers.IntegerField(allow_null=True)
+    repetition_of_id = serializers.IntegerField(allow_null=True)
     schedule_id = serializers.IntegerField()
     memo = serializers.CharField()
     note_id = serializers.IntegerField(allow_null=True)
@@ -741,7 +743,9 @@ class NoteLinkSerializer(serializers.ModelSerializer):
 
 
 class NoteSerializer(serializers.ModelSerializer):
-    contributors = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all(), many=True)
+    contributor_ids = serializers.PrimaryKeyRelatedField(
+        many=True, queryset=Host.objects.all(), source="contributors"
+    )
     image_id = serializers.PrimaryKeyRelatedField(
         queryset=Image.objects.all(), required=False, allow_null=True
     )
@@ -763,7 +767,7 @@ class NoteSerializer(serializers.ModelSerializer):
         fields = (
             "cba_id",
             "content",
-            "contributors",
+            "contributor_ids",
             "id",
             "image_id",
             "links",
diff --git a/program/services.py b/program/services.py
index 005192dbc5e03ee064d710ef502c9b03c418ab94..eb56f7402075cd40b338ba676c9dc68f91c8438c 100644
--- a/program/services.py
+++ b/program/services.py
@@ -25,10 +25,10 @@ from dateutil.rrule import rrule
 from rest_framework.exceptions import ValidationError
 
 from django.core.exceptions import ObjectDoesNotExist
-from django.forms.models import model_to_dict
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 from program.models import Note, RRule, Schedule, ScheduleConflictError, Show, TimeSlot
+from program.serializers import ScheduleSerializer, TimeSlotSerializer
 from program.utils import parse_date, parse_datetime, parse_time
 from steering.settings import (
     AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE,
@@ -271,7 +271,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
     # If there were any errors, don't make any db changes yet
     # but add error messages and return already chosen solutions
     if len(errors) > 0:
-        conflicts = make_conflicts(model_to_dict(new_schedule), new_schedule.pk, show.pk)
+        conflicts = make_conflicts(
+            ScheduleSerializer().to_representation(new_schedule), new_schedule.pk, show.pk
+        )
 
         partly_resolved = conflicts["projected"]
         saved_solutions = {}
@@ -313,9 +315,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
     # If 'dryrun' is true, just return the projected changes instead of executing them
     if "dryrun" in schedule and schedule["dryrun"]:
         return {
-            "create": [model_to_dict(timeslot) for timeslot in to_create],
-            "update": [model_to_dict(timeslot) for timeslot in to_update],
-            "delete": [model_to_dict(timeslot) for timeslot in to_delete],
+            "create": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_create],
+            "update": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_update],
+            "delete": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_delete],
         }
 
     # Database changes if no errors found
@@ -354,7 +356,7 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
     for timeslot in to_delete:
         timeslot.delete()
 
-    return model_to_dict(new_schedule)
+    return ScheduleSerializer().to_representation(new_schedule)
 
 
 def instantiate_upcoming_schedule(
@@ -440,7 +442,7 @@ def make_conflicts(data: ScheduleData, schedule_pk: int | None, show_pk: int) ->
     conflicts = generate_conflicts(timeslots)
 
     # create a new dictionary by adding "schedule" to conflicts
-    return dict(conflicts, schedule=model_to_dict(new_schedule))
+    return dict(conflicts, schedule=ScheduleSerializer().to_representation(new_schedule))
 
 
 def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: