我在表格上生成orm查询时遇到了一个问题。
我在这里有模特:
class Task(models.Model):
deliver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, related_name='task')
tasktype = models.PositiveSmallIntegerField(db_index=True)
description = models.CharField(max_length=500, null=True, blank=True)
delivertime = models.DateTimeField(default=now,db_index=True)
deadlinetime = models.DateTimeField(null=True,db_index=True)
relatedresourceid = models.PositiveIntegerField(null=True)
suggestspendtime = models.PositiveIntegerField(null=True)
subjectid = models.PositiveIntegerField(null=True)
class Lesson(models.Model):
name = models.CharField(max_length=200,null=True,blank=True)
class Exam(models.Model):
name = models.CharField(max_length=200,null=True,blank=True)
所以,在这里,我想从任务模型中查询,对于查询集中的每个Task对象,还有什么:
我想获得一个关键"名称"来自Lesson或Exam模型,即每个Task对象,如果tasktype为1,则从Lesson模型(其中pk==relatedresourceid
)获取名称值,如果tasktype为2,则从Exam模型中获取。
我使用Django1.8和Mysql 5.6
任何人都知道如何使用ORM进行查询?
感谢。
答案 0 :(得分:0)
您应该以另一种方式对情况进行建模:
Item 1
Item 2
Item 3
Item 4
Item 5
这样,您可以轻松地将课程或考试的名称归属于class Task(models.Model):
deliver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, related_name='task')
tasktype = models.PositiveSmallIntegerField(db_index=True)
description = models.CharField(max_length=500, null=True, blank=True)
delivertime = models.DateTimeField(default=now,db_index=True)
deadlinetime = models.DateTimeField(null=True,db_index=True)
relatedresourceid = models.PositiveIntegerField(null=True)
suggestspendtime = models.PositiveIntegerField(null=True)
subjectid = models.PositiveIntegerField(null=True)
class Lesson(models.Model):
name = models.CharField(max_length=200,null=True,blank=True)
tasks = models.ManyToManyField(Task, related_name='lessons')
class Exam(models.Model):
name = models.CharField(max_length=200,null=True,blank=True)
tasks = models.ManyToManyField(Task, related_name='exams')
或<a task>.lessons
对于您当前的方法,您可以采用这种方式取名:
<a task>.exams
这将为您提供如下列表:[{'task_id':task.pk, 'name': Lesson.objects.get(pk=task.relatedresourceid).name if task.tasktype==1 else Exam.objects.get(pk=task.relatedresourceid).name} for task in Task.objects.all()]