使用Django查询从多个表中检索详细信息

时间:2019-12-24 10:52:15

标签: python mysql django django-rest-framework

我需要编写一个django查询,以便能够显示“状态,日期,时间,job_name,sol_name和dept_name” 这样就创建了一个api。

模型类

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_set=Job_Folder.objects.raw('select Job_Folder.status,Job_Folder.date,Job_Folder.time,Job.name,Department.name,Solution.name from Job_Folder,Job,Solution')`

但导致错误。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

无需使用SQL进行查询

只需执行以下步骤:

  • 创建Job_Report模型的序列化器。
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

请按照以下说明获取有关DRF(Django REST框架)https://www.django-rest-framework.org/tutorial/quickstart/的更多信息 您几乎不需要2个小时即可完成本教程,但是请相信我,它将节省您的工作时间。

让我知道您是否需要不带DRF的解决方案。

答案 1 :(得分:1)

models.py

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)

Serializers.py


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

views.py


@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)


urls.py

  • 在功能视图中添加Urls
  

景气!!! API已准备就绪,不要忘记在INSTALLED_APPS的{​​{1}}中添加“ rest_framework”