Python 使用django查询从多个表检索详细信息

Python 使用django查询从多个表检索详细信息,python,mysql,django,django-rest-framework,Python,Mysql,Django,Django Rest Framework,我需要编写一个django查询,以便能够显示“状态、日期、时间、作业名称、sol\u名称和部门名称” 这样就创建了一个RESTAPI 模型类 class Job_Report(models.Model): id:models.BigAutoField(primary_key=True) job_id: models.ForeignKey(Job, models.DO_NOTHING) status:models.CharField(max_length=7) da

我需要编写一个django查询,以便能够显示“状态、日期、时间、作业名称、sol\u名称和部门名称” 这样就创建了一个RESTAPI

模型类

class Job_Report(models.Model):
    id:models.BigAutoField(primary_key=True)
    job_id: models.ForeignKey(Job, models.DO_NOTHING)
    status:models.CharField(max_length=7)
    date: models.DateField()
    time: models.TimeField()    
    duration = models.BigIntegerField(blank=True, null=True)

class Job(models.Model):
    id:models.BigAutoField(primary_key=True)
    name:models.CharField(max_length=500)
    folder_id:models.ForeignKey(Job_folder, models.DO_NOTHING)

class Job_folder(models.Model):
     id:models.BigAutoField(primary_key=True)
     repo_id:models.ForeignKey(Sol_folder, models.DO_NOTHING)

class Sol_folder(models.Model):
      id:models.BigAutoField(primary_key=True)
      sol_id:models.ForeignKey(Solution, models.DO_NOTHING)

class Solution(models.Model):
      id:models.BigAutoField(primary_key=True)
      name:models.CharField(max_length=500)
      dep_id:models.ForeignKey(Department, models.DO_NOTHING)

class Department(models.Model):
      id:models.BigAutoField(primary_key=True)
      dept_name:models.CharField(max_length=500)
我试着用

query\u set=Job\u Folder.objects.raw('select Job\u Folder.status,Job\u Folder.date,Job\u Folder.time,Job.name,Department.name,Solution.name from Job\u Folder,Job,Solution')`
但结果是错误的


如果您使用的是Django Rest Framework,那么在序列化程序中定义计算值就很容易了

无需使用SQL进行查询

只需按照以下步骤操作:

  • 创建作业报告模型的序列化程序
下面是关于DRF(Django REST框架)的更多信息 完成本教程几乎不需要两个小时,但相信我,这将节省您的工作时间

如果您想要不带DRF的解决方案,请告诉我。

models.py 序列化程序.py views.py url.py
  • 向功能视图添加URL
轰!!!API已准备就绪,别忘了在
安装的应用程序中添加“rest\u框架”
设置.py中


部门和工作报告未连接。如何编写DRF?如果我需要为所有的模型写文章,还是只为Job_报告写文章,这是相当令人困惑的。有什么帮助吗?还有serializers.py抛出错误。问题在于序列化程序classI将其作为答案发布,因为Comments中存在字数限制i遇到错误“int”对象没有属性“name”
class Job_ReportSerializer(serializers.ModelSerializer):
   job = serializers.SerializerMethodField()
   sol = serializers.SerializerMethodField()
   dept = serializers.SerializerMethodField()

  class Meta:
      model = Job_Report
      fields = '__all__'

  def get_job(self, obj): 
      # 'get_' + 'attribute-name' to give definition
      return obj.job.job_name

   def get_sol(self, obj):
       return obj.job.folder.sol.sol_name

   . 
   .
   .
   # Define for all SerializerMethodField
All your models as you defined, 

Just make one change:
- Do not use ids. Just use foreign keys.

class Job_Report(models.Model):
    job: models.ForeignKey(Job, models.DO_NOTHING)
    status:models.CharField(max_length=7)
    date: models.DateField()
    time: models.TimeField()    
    duration = models.BigIntegerField(blank=True, null=True)

class Job(models.Model):
    name:models.CharField(max_length=500)
    folder:models.ForeignKey(Job_folder, models.DO_NOTHING)

class Job_folder(models.Model):
     name:models.CharField()
     repo:models.ForeignKey(Sol_folder, models.DO_NOTHING)

class Sol_folder(models.Model):
      name:models.CharField(max_length=500)
      sol:models.ForeignKey(Solution, models.DO_NOTHING)

class Solution(models.Model):
      name:models.CharField(max_length=500)
      dept:models.ForeignKey(Department, models.DO_NOTHING)

class Department(models.Model):
      name:models.CharField(max_length=500)


class Job_ReportSerializer(serializers.ModelSerializer):
   job = serializers.SerializerMethodField()
   sol = serializers.SerializerMethodField()
   dept = serializers.SerializerMethodField()

  class Meta:
      model = Job_Report
      fields = '__all__'

  def get_job(self, obj): 
      # 'get_' + 'attribute-name' to give definition
      return obj.job.name

   def get_sol(self, obj):
       return obj.job.folder.sol.name

   . 
   .
   .
   # Define for all SerializerMethodField


@api_view(['GET'])
def list_reports(request):
   job_reports = Job_Report.objects.all()
   data = JobReportSerializer(job_reports, many=True, context={'request':request}).data
   return Response(data)

@api_view(['GET'])
def detail_report(request, pk):
   job_report = Job_Report.objects.get(id=pk)
   data = JobReportSerializer(job_report,context={'request':request}).data
   return Response(data)