chuluunhvv Nyamjaw
chuluunhvv Nyamjaw

Reputation: 73

Restframework serializer relation get foreignkey field

How to get using DRF get another table's field using foreign field.

My Model 1

class Teacher_lesson_price(models.Model):
    id = models.AutoField(primary_key=True)
    teacher_id = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=False)
    subject_id = models.ForeignKey(Subject, related_name='subject_name_rel', on_delete=models.CASCADE, null=False)
    course_id = models.ForeignKey(Course, on_delete=models.CASCADE , null=False, default=None)
    price = models.CharField(max_length=250)

Model 2

class Subject(models.Model):
    id = models.AutoField(primary_key=True)
    subject_name = models.CharField(max_length=255)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)

My serializers

class getSubjectall(serializers.ModelSerializer):    
      class Meta:
            model =  Subject
            fields = '__all__'        

class getSubjectApi(serializers.ModelSerializer):
    subject_name = getSubjectall(read_only=True)
    class Meta:
        model = Teacher_lesson_price      
        fields = ['id', 'teacher_id', 'subject_id', 'course_id', 'price', 'subject_name']

I tried like this and many others too example: using related_name to my getSubjectApi serializer with different type of serializers.fields

subject_name_rel = serializers.ReadOnlyField(source='Subject.subject_name', read_only=True)

Still not working.

View

@api_view(['GET'])
def subjectApiView(request):   
    teacherLessonPrice = Teacher_lesson_price.objects.filter(teacher_id = request.user.teacher.id)
    serializer = getSubjectApi(teacherLessonPrice, many=True)
    return Response(serializer.data)

I need a result like this (similar). How can I do this?

[
        {
            "id": 29,
            "teacher_id": 14,
            "subject":{
                "subject_id": 1,
                "subject_name": "Math"
            },
            "course_id": 3,
            "price": "10000"
        },
        {
            "id": 30,
            "teacher_id": 14,
            "subject":{
                "subject_id": 2,
                "subject_name": "English"
            },
            "course_id": 1,
            "price": "20000"
        },
        {
            "id": 31,
            "teacher_id": 15, #if other teacher login
            "subject":{
                "subject_id": 1,
                "subject_name": "Math"
            },
            "course_id": 1,
            "price": "20000"
        },
    ]

Upvotes: 0

Views: 66

Answers (1)

Milon Mahato
Milon Mahato

Reputation: 190

You can try to change your getSubjectApi serializer like this:

class getSubjectApi(serializers.ModelSerializer):
    subject = getSubjectall(source='subject_id', read_only=True)

    class Meta:
        model = Teacher_lesson_price
        fields = ['id', 'teacher_id', 'subject_id', 'course_id', 'price', 'subject']

You will get following response:

[
  {
    "id": 1,
    "teacher_id": "11",
    "subject_id": 1,
    "course_id": "11",
    "price": "1000",
    "subject": {
      "id": 1,
      "subject_name": "new_subject"
    }
  },
  {
    "id": 2,
    "teacher_id": "13",
    "subject_id": 2,
    "course_id": "22",
    "price": "12222",
    "subject": {
      "id": 2,
      "subject_name": "another_subject"
    }
  }
]

Upvotes: 1

Related Questions