gpt4 book ai didi

django - 如何使用直通表并指向 self 使用 ManyToManyField 设置 related_name

转载 作者:行者123 更新时间:2023-12-04 20:39:56 28 4
gpt4 key购买 nike

我有一个任务类,可以有子任务,所以这是一个循环关系。我通过链接器模型/表传递它,如下所示:

class Task(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(blank=True)
completed = models.BooleanField(default=False)
project = models.ForeignKey('Project', related_name="tasks")
dependancy = models.ManyToManyField('self', through='Dependancy', null=True,
blank=True, through_fields=('task', 'sub_task'), symmetrical=False)
def __str__(self):
return self.title

class Dependancy(models.Model):
task = models.ForeignKey(Task)
sub_task = models.ForeignKey(Task)

但我收到此错误:
ERRORS:
gantt_charts.dependency.sub_task: (fields.E303) Reverse query name for 'dependency.sub_task' clashes with field name 'Task.dependency'.
HINT: Rename field 'Task.dependency', or add/change a related_name argument to the definition for field 'dependency.sub_task'.
gantt_charts.dependency.sub_task: (fields.E304) Reverse accessor for 'dependency.sub_task' clashes with reverse accessor for 'dependency.task'.
HINT: Add or change a related_name argument to the definition for 'dependency.sub_task' or 'dependency.task'.


gantt_charts.dependency.task: (fields.E303) Reverse query name for 'dependency.task' clashes with field name 'Task.dependency'.
HINT: Rename field 'Task.dependency', or add/change a related_name argument to the definition for field 'dependency.task'.
gantt_charts.dependency.task: (fields.E304) Reverse accessor for 'dependency.task' clashes with reverse accessor for 'dependency.sub_task'.
HINT: Add or change a related_name argument to the definition for 'dependency.task' or 'dependency.sub_task'.

显然我需要在 Dependency.sub_task 和 Dependency.task 字段上设置相关名称,并遵循解决方案 here是将它们命名为 task_tasktask_sub_task ,但这听起来是错误的、不直观且令人困惑的。

什么是他们的清晰简洁的名称?如果我在使用链接表时不会对相关名称是什么感到困惑,那会更容易。

最佳答案

给定一个 Task例如,您如何访问所有 Dependencies将其作为他们的 task ?或者他们的 sub_task ?这就是related_name的目的— 它提供了 Django 将在 Task 上创建的属性的名称指向那组东西。

您看到该错误是因为 Django 自动使用名称 <model>_set ,并且由于您有两个 ForeignKeys指向同一个模型,默认名称会发生​​冲突。

现在,您可能永远不需要直接访问 Dependencies那样。如果是这种情况,您可以添加 related_name='+'到这两个字段,并且根本不会创建 reverse 属性(并且您的错误将消失)。

如果您确实想访问它们,名称由您决定。我更喜欢更长但更具描述性的名称,以明确其目的。我可能会像这样对问题进行建模:

class Task(models.Model): 
subtasks = models.ManyToManyField('self',
through='Dependancy',
symmetrical=False,
through_fields=('supertask', 'subtask'),
related_name='supertasks')

class Dependancy(models.Model):
supertask = models.ForeignKey(Task, related_name='dependencies_as_supertask')
subtask = models.ForeignKey(Task, related_name='dependencies_as_subtask')

class Meta:
unique_together = ('supertask', 'subtask')


>>> task = Task.objects.get()

>>> # all the Tasks that are supertasks of this one
>>> task.supertasks

>>> # all the Tasks that are subtasks of this one
>>> task.subtasks

>>> # all the Dependencies with this Task as the supertask
>>> task.dependencies_as_supertask

>>> # all the Dependencies with this Task as the subtask
>>> task.dependencies_as_subtask

关于django - 如何使用直通表并指向 self 使用 ManyToManyField 设置 related_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28071554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com