Django 无法显示M2M关系中的所有结果

Django 无法显示M2M关系中的所有结果,django,django-models,django-queryset,Django,Django Models,Django Queryset,目前,我有以下实体关系模型: 表关系 ------------ ----------------- ------ | Objective | ------- | Objective_Task | ---------| Task | ------------ ----------------- ------ 我试图显示下表中的结果 | id | Task | Task status

目前,我有以下实体关系模型:

表关系

 ------------          -----------------           ------
| Objective | ------- | Objective_Task | ---------| Task |
 ------------          -----------------           ------
我试图显示下表中的结果

| id  |        Task        |   Task status |     Objective      |
----------------------------------------------------------------
|  1  |  Set up drivers    | In progress   | Set up my machine  |
|  2  |  Configure network | In progress   | Set up the network |
|  3  |  Test the network  | In progress   | Set up the network |
但我得到的结果是:

| id  |        Task        |   Task status |        Objective          |
-----------------------------------------------------------------------
|  1  |  Set up drivers    | In progress   | objective.Objective.None  |
|  2  |  Configure network | In progress   | objective.Objective.None  |
|  3  |  Test the network  | In progress   | objective.Objective.None  |
以下是此实体关系的my class模型设置:

目标模型

class Objective(models.Model):
    id               = models.AutoField(primary_key=True)
    objective        = models.CharField(null=False, max_length=60)
    initial_date     = models.DateField(default=timezone.now(), null=False)
    expiration_date  = models.DateField()

    class Meta:
        ordering = ['initial_date']
        db_table = 'goal_objective'
class Task(models.Model):
    ACTIVE = 'Active'
    FINALIZED = 'Finalized'

    STATUS = [(ACTIVE, ACTIVE), (FINALIZED, FINALIZED)]

    id           = models.AutoField(primary_key=True)
    objective    = models.ManyToManyField(Objective)
    task         = models.CharField(null=False, max_length=140)
    status       = models.CharField(max_length=24, choices=STATUS, default=ACTIVE)

    class Meta:
        db_table = 'task_table'
{% for task in task_list %}
<table>
    <tbody>
        <tr>
         <td>{{task.id}}</td>
         <td>{{task.task}}</td>
         <td>{{task.status}}</td>
         <td>{{task.objective}}</td>
        </tr>
   </tbody>
</table>
任务模型

class Objective(models.Model):
    id               = models.AutoField(primary_key=True)
    objective        = models.CharField(null=False, max_length=60)
    initial_date     = models.DateField(default=timezone.now(), null=False)
    expiration_date  = models.DateField()

    class Meta:
        ordering = ['initial_date']
        db_table = 'goal_objective'
class Task(models.Model):
    ACTIVE = 'Active'
    FINALIZED = 'Finalized'

    STATUS = [(ACTIVE, ACTIVE), (FINALIZED, FINALIZED)]

    id           = models.AutoField(primary_key=True)
    objective    = models.ManyToManyField(Objective)
    task         = models.CharField(null=False, max_length=140)
    status       = models.CharField(max_length=24, choices=STATUS, default=ACTIVE)

    class Meta:
        db_table = 'task_table'
{% for task in task_list %}
<table>
    <tbody>
        <tr>
         <td>{{task.id}}</td>
         <td>{{task.task}}</td>
         <td>{{task.status}}</td>
         <td>{{task.objective}}</td>
        </tr>
   </tbody>
</table>
这是我用来填充表的代码

objective_ids = []
qs_current_objectives = Objective.objects.filter(initial_date__gte=date(2020,1,1), expiration_date__lte=date(2020,12,31)).values('id').values_list('id')

for value in qs_current_objectives:
    objective_ids.append(value)    

form = {'task_list': Task.objects.filter(objective__in=objective_ids)}
retrieval.html

class Objective(models.Model):
    id               = models.AutoField(primary_key=True)
    objective        = models.CharField(null=False, max_length=60)
    initial_date     = models.DateField(default=timezone.now(), null=False)
    expiration_date  = models.DateField()

    class Meta:
        ordering = ['initial_date']
        db_table = 'goal_objective'
class Task(models.Model):
    ACTIVE = 'Active'
    FINALIZED = 'Finalized'

    STATUS = [(ACTIVE, ACTIVE), (FINALIZED, FINALIZED)]

    id           = models.AutoField(primary_key=True)
    objective    = models.ManyToManyField(Objective)
    task         = models.CharField(null=False, max_length=140)
    status       = models.CharField(max_length=24, choices=STATUS, default=ACTIVE)

    class Meta:
        db_table = 'task_table'
{% for task in task_list %}
<table>
    <tbody>
        <tr>
         <td>{{task.id}}</td>
         <td>{{task.task}}</td>
         <td>{{task.status}}</td>
         <td>{{task.objective}}</td>
        </tr>
   </tbody>
</table>
{%用于任务列表%中的任务}
{{task.id}
{{task.task}
{{task.status}
{{task.objective}

在我的模型中,我遗漏了哪些我无法达到目标名称的地方?

为了避免将来出现问题,您应该更改一些内容

class Objective(models.Model):
    initial_date = models.DateField(default=timezone.now, null=False)
请注意,您传入的是函数,而不是调用
default
函数的结果。如果您执行现有操作,则每次重新启动web服务器时,默认值都会更改。将函数传递到默认值将把日期设置为当前日期

class Task(models.Model):
    objectives    = models.ManyToManyField(Objective, related_name='tasks')
使用单词的复数形式命名关系可以使代码更容易理解。现在,当您访问
task.objectives
时,您知道这是一个集合<代码>任务。目标让人觉得应该只有一个

在您的视图中,您不需要指定只需要id。只要您传递的是Queryset的实例,Django就会知道这一点。它还将只进行一次查询来获取数据

current_objectives = Objective.objects.filter(
    initial_date__gte=date(2020,1,1),
    expiration_date__lte=date(2020,12,31)
)
tasks = Task.objects.filter(objectives__in=current_objectives).distinct()
form = {'task_list': tasks}
也可以在过滤器中遍历关系

tasks = Task.objects.filter(
    objectives__initial_date__gte=date(2020,1,1),
    objectives__expiration_date__lte=date(2020,12,31),
).distinct()
form = {'task_list': tasks}
那么您的模板应该如下所示:

{% for task in task_list %}
<table>
    <tbody>
        <tr>
         <td>{{task.id}}</td>
         <td>{{task.task}}</td>
         <td>{{task.status}}</td>
         <td>{{task.objectives.all}}</td>
        </tr>
   </tbody>
</table>
{% endfor %}
{%用于任务列表%中的任务}
{{task.id}
{{task.task}
{{task.status}
{{task.objectives.all}
{%endfor%}

task.objective
(或当前代码中的
task.objective
)只是对Manager实例的引用,而不是集合本身。您需要访问
.all
以获取实际数据。

您是否填写了任务和目标之间的关系?非常感谢您的宝贵反馈!让我在代码中得到这些更改。我将尝试在输入此代码后尽快回复。如果不使用
任务.目标。所有
我只想显示目标的实际名称,该怎么办?我找到了上一条评论的解决方案,我必须创建一个自定义模板标记: