Django ORM:根据一个字段值动态确定另一个表名

时间:2016-05-27 12:41:21

标签: python mysql django orm

我在表格上生成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进行查询?

感谢。

1 个答案:

答案 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()]