【问题标题】: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')