【问题标题】:Access to fields of on reverse relation in django在 django 中访问反向关系的字段
【发布时间】:2018-02-06 19:30:03
【问题描述】:

我有这些模型:

class Task(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField()

class Report(models.Model):
    task = models.ForeignKey(
        Task, blank=True, null=True, related_name='+')
    status = models.CharField(max_length=32, choices=Status.CHOICES, default=Status.INCOMPLETE)

现在我想获取所有Tasks 及其相关状态。

我该怎么做?

【问题讨论】:

标签: python django django-models django-views foreign-keys


【解决方案1】:

在这种情况下,+ 正是您不希望拥有的 related_name 符号。它告诉 Django 不要创建反向关系。查看here。选择另一个有效名称或跳过此参数,在这种情况下,Django 将默认创建反向关系,使用小写的模型名称和后缀_set 作为反向关系的名称(详见here)。

但是,在您的示例中,如果您想获取与任务和相应状态相关的所有报告,则不一定需要反向关系。试试这个:

reports = Report.objects.exclude(task__isnull=True).values('task__name', 'status')

【讨论】:

    【解决方案2】:

    起初,'+' 不是有效的related_name。它也不是很明确。

    尝试将'+' 替换为'reports'

    # ...
    
    class Report(models.Model):
        task = models.ForeignKey(
            Task,
            blank=True,
            null=True,
            related_name='reports'  # <<<
        )
        status = models.CharField(
            max_length=32,
            choices=Status.CHOICES,
            default=Status.INCOMPLETE
        )
    

    然后要获取所有Tasks及其相关状态,您可以使用values

    >>> Task.objects.values('name', 'report__status')
    <QuerySet [{'name': 'test', 'report__status': 'OK'}, ...]>
    

    【讨论】:

      【解决方案3】:

      related_name 的值更改为其他值,例如'reports'

      class Report(models.Model):
          task = models.ForeignKey(
              Task, blank=True, null=True, related_name='reports')
          status = models.CharField(max_length=32, choices=Status.CHOICES, default=Status.INCOMPLETE)
      

      现在,如果您有一个任务对象(不是查询集),您可以使用以下方法获取它的报告的查询集:

      reports = task.reports.all()

      如果需要,您可以在 reports 上使用 filter()。

      reports = task.reports.filter(status='something')

      【讨论】:

        猜你喜欢
        • 2018-07-05
        • 1970-01-01
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多