【问题标题】:Retrieve details from multiple tables using django query使用 django 查询从多个表中检索详细信息
【发布时间】:2020-04-15 11:19:00
【问题描述】:

我需要编写一个 django 查询,以便能够显示“状态、日期、时间、job_name、sol_name 和 dept_name” 这样就创建了一个rest 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')`

但导致错误。

任何帮助将不胜感激。

【问题讨论】:

  • Department 和 Job_Report 未连接。

标签: python mysql django django-rest-framework


【解决方案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 的解决方案,请告诉我。

【讨论】:

  • 如何编写 DRF?如果我需要为所有模型或只为 Job_Report 编写,这会很令人困惑。有什么帮助吗?
  • serializers.py 也会抛出错误。故障在于序列化程序类
  • 我将其发布为答案,因为 cmets 有字数限制
【解决方案2】:

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)

序列化器.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

  • 将 URL 添加到功能视图中

轰!!! API 已准备就绪,别忘了在INSTALLED_APPS 中添加“rest_framework”settings.py

【讨论】:

  • 我遇到了一个错误'int' object has no attribute 'name'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2018-04-30
  • 2020-03-25
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多