[Django]-How to POST Model with Many to Many through in Django REST


Normally I workaround by indirect way by POST to through table and implement nested-create(). Please provide me more information if my answer is inaccurate.


from django.db import models

class ICD10(models.Model):
    primary_key_number = models.CharField(max_length=10, primary_key=True)
    star_key_number = models.CharField(max_length=10, blank=True, null=True)
    additional_key_number = models.CharField(max_length=10, blank=True, null=True)
    preferred_short_description = models.CharField(max_length=128, )

    def __str__(self):
        return f'{self.primary_key_number} {self.star_key_number}'

class CaseICD10Connection(models.Model):
    case = models.ForeignKey('KeyDateCase', related_name='connections', related_query_name='key_date_cases', on_delete=models.CASCADE)
    icd_10 = models.ForeignKey('ICD10', related_name='connections', related_query_name='icd_10s', on_delete=models.CASCADE)
    is_primary = models.BooleanField(default=False)
    certainty = models.CharField(max_length=1, default='G', )

class KeyDateCase(models.Model):
    name = models.CharField(max_length=20)
    diagnose_all_icd_10 = models.ManyToManyField(ICD10, related_name='icd10s', related_query_name='icd10s',


from rest_framework import serializers

from keydatecases.models import KeyDateCase, ICD10, CaseICD10Connection

class KeyDateCaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = KeyDateCase
        fields = [
        read_only_fields = ['id', 'diagnose_all_icd_10']

class ICD10Serializer(serializers.ModelSerializer):
    class Meta:
        model = ICD10
        fields = [

class CaseICD10ConnectionSerializer(serializers.ModelSerializer):
    case = KeyDateCaseSerializer()
    icd_10 = ICD10Serializer()

    class Meta:
        model = CaseICD10Connection
        fields = [

    def create(self, validated_data) -> CaseICD10Connection:
        # import ipdb;
        # ipdb.set_trace()
        # create key_date_case
        key_date_case = KeyDateCase.objects.create(**validated_data.get('case'))

        # create icd10
        icd10 = ICD10.objects.create(**validated_data.get('icd_10'))

        # create connection
        conn = CaseICD10Connection.objects.create(
            case=key_date_case, icd_10=icd10, is_primary=validated_data.get('is_primary'),
        return conn


from rest_framework import viewsets

from keydatecases.api.serializers import CaseICD10ConnectionSerializer
from keydatecases.models import CaseICD10Connection

class CaseICD10ConnectionViewSet(viewsets.ModelViewSet):
    permission_classes = ()
    queryset = CaseICD10Connection.objects.all()
    serializer_class = CaseICD10ConnectionSerializer

My Repository:
I share my repository with many questions. Please do not mind it.



In regards to creating or updating nested objects, the documentation actually has a great example. I would provide you a better one if I could. If there is anything confusing in the example, happy to explain it here.

If you follow this approach, your GET requests will expand the nested objects automatically for you.


Leave a comment