Python 使用django查询从多个表检索详细信息
我需要编写一个django查询,以便能够显示“状态、日期、时间、作业名称、sol\u名称和部门名称” 这样就创建了一个RESTAPI 模型类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
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进行查询 只需按照以下步骤操作:
- 创建作业报告模型的序列化程序
- 向功能视图添加URL
安装的应用程序中添加“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)