【问题标题】:Django ORM: Dynamically determine another table name according one field valueDjango ORM:根据一个字段值动态确定另一个表名
【发布时间】:2016-05-27 12:41:21
【问题描述】:

在对那里的表生成 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)

所以,这里我想从任务模型中查询,更重要的是,对于查询集中的每个任务对象:

我想从课程或考试模型中获取一个带有键“名称”的值,即对于每个任务对象,如果任务类型为 1,则从课程模型(其中 pk==relatedresourceid)获取名称值,如果任务类型为 2,则从考试模型中获取。

我使用 Django1.8 和 Mysql 5.6

有人知道如何使用 ORM 进行查询吗?

谢谢。

【问题讨论】:

  • 每个任务属于课程还是考试?我的意思是,在你试图解决的现实问题中。
  • 是的,每个任务都属于课程或考试。如果 tasktype 为 1 ,则为课程, 2 为考试。并通过 relatedresourceid 获取课程或考试对象
  • 那你应该用另一种方式来模拟这种情况,下面是我的回应
  • 是的,我知道我们可以使用 ForeignKey 或其他约束,但是,由于某些特殊原因,我们没有使用。也许我们可以用原始 sql 来做到这一点,但我不想因为以后有数据库引擎传输。其实我也不知道怎么写原始的sql……哈哈
  • 我知道tasktype 告诉您需要查看的表格,但是,您必须参加考试/课程表格中的哪个name

标签: python mysql django orm


【解决方案1】:

你应该用另一种方式模拟这种情况:

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

这会给你一个类似的列表:[{'task_id':1, 'name': <Lesson or Exam name 1>}, {'task_id':2, 'name': <Lesson or Exam name 2>}, ..., {'task_id':N, 'name': <Lesson or Exam name N>}]

【讨论】:

  • 不能使用foreighkey或manytomanyfield,除了relatedresourceid,我们还需要tasktype来处理Lesson或Exam对象。
  • 对不起,哥们,我需要请假,回来会回复你的。谢谢。
  • 也许我没有更详细地描述我的问题。我不想再次遍历查询集,如果是这样,我可以获得没有任何相关字段的结果。我要问的是我们可以从一个 ORM 查询字符串中得到结果吗?
  • 这在您当前的模型结构中是不可能的,因为它们之间没有关系。
  • 也许你是对的,我稍后会深入研究,但现在接受你的回答。谢谢。
猜你喜欢
  • 2019-03-22
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2017-02-28
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多