需要 return 使用 django rest 框架的不同模型中的外键 ID 的值
Need to return the value of a foreign key ID in a different model using 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__'
视图集
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
其实我需要从Job模型中的Project模型中获取项目名称。由于项目是作业模型中的外键,它在作业模型中返回 project_id 但我需要获取项目名称以及作业模型响应中的 id。我已经尝试使用查询集,但无法获得预期的结果。使用 get 调用函数时需要得到低于结果的 ike。
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
。
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__'
视图集
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
其实我需要从Job模型中的Project模型中获取项目名称。由于项目是作业模型中的外键,它在作业模型中返回 project_id 但我需要获取项目名称以及作业模型响应中的 id。我已经尝试使用查询集,但无法获得预期的结果。使用 get 调用函数时需要得到低于结果的 ike。
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
。