Необходимо вернуть значение внешнего ключа ID в другой модели, используя django rest framework
models.py
class Project(models.Model):
project_name = models.CharField(max_length=20)
client= models.ForeignKey(Client,on_delete=CASCADE,related_name="Client1",default=None)
user=models.ManyToManyField(Default_User,related_name='users',default=None)
description=models.TextField()
type=models.TextField()
class Meta:
db_table ='Project'
def __str__(self):
return self.project_name
class Job(models.Model):
job_name=models.CharField(max_length=50)
user= models.ForeignKey(Default_User,on_delete=CASCADE)
project = ChainedForeignKey(Project,chained_field="user", chained_model_field="user",related_name='projects',show_all=False, auto_choose=True, sort=True)
date = models.DateField(max_length=10,default=None)
class Meta:
db_table ='Job'
def __str__(self):
return '{}'.format(self.job_name)
Сериализаторы
class ProjectSerializers(serializers.ModelSerializer):
class Meta:
model= Project
fields= '__all__'
class Job_Serializers(serializers.ModelSerializer):
class Meta:
model= Job
fields = '__all__'
viewsets
class ProjectViewSet(viewsets.ModelViewSet):
authentication_classes =[JWTAuthentication]
permission_classes=(permissions.IsAdminUser,)
queryset=models.Project.objects.all()
serializer_class=serializers.ProjectSerializers
filter_backends = [filters.SearchFilter]
search_fields = ['project_name']
class Job_Viewset(viewsets.ModelViewSet):
renderer_classes = (CustomRenderer, )
authentication_classes =[JWTAuthentication]
permission_classes=(permissions.IsAdminUser,)
queryset=models.Job.objects.all().order_by('-id')
serializer_class=serializers.Job_Serializers
На самом деле мне нужно получить название проекта из модели Project в модели Job. Поскольку сейчас project является внешним ключом в модели Job, он возвращает project_id в модели Job, но мне нужно получить название проекта вместе с id в ответе модели Job. Я пробовал использовать набор запросов, но не смог получить результаты, которые ожидал. Нужно получить следующие результаты при использовании функции get call.
Result expected:
{
"id": 1,
"job_name": "API for Timesheet",
"date": "2022-03-08",
"user": 2,
"project": 1,
"project_name": timesheet #need to get like this
}
Вам следует изменить Job_Serializers :
class Job_Serializers(serializers.ModelSerializer):
project = ProjectSerializers()
class Meta:
model= Job
fields = '__all__'
Результатом будет:
{
"id": 1,
"job_name": "API for Timesheet",
"date": "2022-03-08",
"user": 2,
"project": { "id": 1,
"project_name": timesheet #need to get like this,
...
}
}
Или вы можете добавить некоторые поля на Job_Serializers:
class Job_Serializers(serializers.ModelSerializer):
project_name = serializers.CharField(source='project.project_name')
class Meta:
model= Job
fields = ['job_name', 'id', 'date', 'user', 'project', 'project_name']
Результатом должно быть
{
"id": 1,
"job_name": "API for Timesheet",
"date": "2022-03-08",
"user": 2,
"project": 1,
"project_name": timesheet #need to get like this
}
В конечном итоге лучше изменить Job_Serializers на JobSerializers.