django 如何根据是否与子模型有关系来过滤父模型中的数据

wmtdaxz3  于 2022-12-24  发布在  Go
关注(0)|答案(2)|浏览(153)

我有这些模型

class Tree(models.Model):
    field = models.TextField()

class TaskProgress(models.Model):
    base_task = models.ForeignKey(BaseTask, on_delete=models.CASCADE)
    tree = models.ForeignKey(Tree, on_delete=models.CASCADE)

class BaseTask(models.Model):
   trees=models.ManyToManyField(Tree, through='TaskProgress')

class TaskType1(BaseTask):
   child1_field = models.TextField()

class TaskType2(BaseTask):
   child2_field = models.TextField()

如何获取与TaskType2相关的所有任务进度,

TaskProgress.objects.filter(???)
fjaof16o

fjaof16o1#

我在BaseTask类上添加了额外字段

TASK_TYPE =[('I','Irrigation'),('C','Care'),('A','Assessment'),('O','Other')]

class BaseTask(models.Model):
    trees=models.ManyToManyField(Tree, through='TaskProgress')
    worker = models.ManyToManyField(User)
    task_type = models.CharField(max_length=1,choices=TASK_TYPE,null=True)

过滤器会是这样的

TaskProgress.objects.filter(base_task__task = "I")
afdcj2ne

afdcj2ne2#

如果模型的设计与描述的一样,我认为您所要求的是不可能的。base_task外键专门指向BaseTask。即使TaskType1和TaskType2继承自BaseTask,它们在数据库中也没有关系。它们只是看起来相似。
选项1:研究Django中的泛型关系。基本上,它允许你与多个类型的模型建立外键关系。但我不推荐它。如果你不知道你在做什么,泛型关系会很混乱。
选项2:重新考虑布局。也许可以将关系移动到两个TaskType,并通过related_name来寻址它们。

class TaskProgress(models.Model):
    # base_task = models.ForeignKey(BaseTask, on_delete=models.CASCADE)
    tree = models.ForeignKey(Tree, on_delete=models.CASCADE)

class TaskType1(BaseTask):
   task_progress = models.OneToOneField(TaskProgress, related_name='task_type_1'
   child1_field = models.TextField()

class TaskType2(BaseTask):
   task_progress = models.OneToOneField(TaskProgress, related_name='task_type_2'
   child2_field = models.TextField()

这样,您就在TaskProgress和TaskType之间创建了一个一对一的关系。您应该能够通过检查是否存在关系来查询其中一个,例如,所有TaskProgress示例都与TaskType1示例有关系。

# Query all TaskProgress instances, that have a TaskType1
TaskProgress.objects.filter(task_type_1__isnull=False)

相关问题