Reputation: 73
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
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