我需要编写一个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')`
但导致错误。
任何帮助将不胜感激。
答案 0 :(得分:1)
如果您使用的是Django Rest Framework,那么在序列化程序中定义计算值很容易:
无需使用SQL进行查询
只需执行以下步骤:
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)
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)
景气!!! API已准备就绪,不要忘记在
INSTALLED_APPS
的{{1}}中添加“ rest_framework”