需要 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