在 Django 中使用 related_name
Using related_name in Django
我对 Django 模型中 related_name 的用法感到困惑,我知道这个想法是让我使用外键访问不同 table 的所有字段我只是不是确定如何使用它。
我的model.py:
class Component(MPTTModel):
name = models.CharField(max_length=100)
manufacturer = models.CharField(max_length=100)
model = models.CharField(max_length=100)
serial_number = models.CharField(max_length=255)
price = models.IntegerField()
note = models.TextField()
image = models.ImageField(blank=True, null=True,
upload_to='components_imgs')
parent = TreeForeignKey("self", verbose_name=(
"Parent Component"), blank=True, null=True, related_name='children', on_delete=models.CASCADE)
def __str__(self):
return f"{self.id}, {self.name}"
class Job(models.Model):
job_type = (
('I', 'Interval'),
('O', 'One time'),
)
name = models.CharField(max_length=100)
description = models.CharField(max_length=100)
type = models.CharField(max_length=1, choices=job_type)
interval = models.IntegerField()
is_critical = models.BooleanField()
due_date = models.DateField()
component = models.ForeignKey(
Component, related_name='jobs', on_delete=models.CASCADE)
runninghours = models.ForeignKey(
RunningHours, related_name="RHjobs", on_delete=models.CASCADE)
def __str__(self):
return self.name
我的view.py:
def worklist(request):
components = Component.objects.all()
Component_jobs = components.jobs.all()
context = {"component":components,
"Component_jobs":Component_jobs}
return render(request,"worklist.html",context)
我试图理解为什么这些行给我一个错误 'TreeQuerySet' object has no attribute 'jobs'
components = Component.objects.all()
Component_jobs = components.jobs.all()
但是这些行工作得很好,
component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()
它们是不一样的,但是一个我得到了特定 ID 的所有工作,另一个我得到了所有组件的所有工作?
已编辑,
我的模板:
<div class="worklist">
{%for component in component %}
<p> {{component.name}} </p>
<div class="runninghours-table-flex">
<table class="runninghours-table">
<thead>
<tr>
<th>Job name</th>
<th>Job type</th>
<th>Due Date </th>
<th>Interval</th>
<th>Rank</th>
<th>Execute Job</th>
</tr>
</thead>
<tbody>
{% for c_jobs in component_jobs%}
<tr>
<td>{{c_jobs.name}} </td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{%endfor%}
</tbody>
</table>
</div>
{%endfor%}
</div>
如错误所述,此代码 returns 一个 TreeQuerySet 对象。
components = Component.objects.all()
尝试调用 price
之类的字段将导致相同的错误。
components = Component.objects.all()
Component_jobs = components.price.all()
此代码之所以有效,是因为它是在特定组件而不是组件集合上调用的。
component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()
要获取查询集上的所有作业,请尝试使用 queryset api reference
中的 .values('jobs')
all_jobs = Component.objects.all().values('jobs')
假设您想要在一个循环中显示所有组件,然后在一个嵌套循环中显示每个组件的所有相关作业,您的模板应该类似于这个简化示例
{% for component in components %}
{{ component }}
{% for job in component.jobs.all %}
{{ job }}
{% endfor %}
{% endfor %}
然后您应该使用 prefetch_related
在单个查询中获取所有组件的所有相关作业。无需查询您认为的职位
components = Component.objects.all().prefetch_related('jobs')
我对 Django 模型中 related_name 的用法感到困惑,我知道这个想法是让我使用外键访问不同 table 的所有字段我只是不是确定如何使用它。
我的model.py:
class Component(MPTTModel):
name = models.CharField(max_length=100)
manufacturer = models.CharField(max_length=100)
model = models.CharField(max_length=100)
serial_number = models.CharField(max_length=255)
price = models.IntegerField()
note = models.TextField()
image = models.ImageField(blank=True, null=True,
upload_to='components_imgs')
parent = TreeForeignKey("self", verbose_name=(
"Parent Component"), blank=True, null=True, related_name='children', on_delete=models.CASCADE)
def __str__(self):
return f"{self.id}, {self.name}"
class Job(models.Model):
job_type = (
('I', 'Interval'),
('O', 'One time'),
)
name = models.CharField(max_length=100)
description = models.CharField(max_length=100)
type = models.CharField(max_length=1, choices=job_type)
interval = models.IntegerField()
is_critical = models.BooleanField()
due_date = models.DateField()
component = models.ForeignKey(
Component, related_name='jobs', on_delete=models.CASCADE)
runninghours = models.ForeignKey(
RunningHours, related_name="RHjobs", on_delete=models.CASCADE)
def __str__(self):
return self.name
我的view.py:
def worklist(request):
components = Component.objects.all()
Component_jobs = components.jobs.all()
context = {"component":components,
"Component_jobs":Component_jobs}
return render(request,"worklist.html",context)
我试图理解为什么这些行给我一个错误 'TreeQuerySet' object has no attribute 'jobs'
components = Component.objects.all()
Component_jobs = components.jobs.all()
但是这些行工作得很好,
component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()
它们是不一样的,但是一个我得到了特定 ID 的所有工作,另一个我得到了所有组件的所有工作?
已编辑, 我的模板:
<div class="worklist">
{%for component in component %}
<p> {{component.name}} </p>
<div class="runninghours-table-flex">
<table class="runninghours-table">
<thead>
<tr>
<th>Job name</th>
<th>Job type</th>
<th>Due Date </th>
<th>Interval</th>
<th>Rank</th>
<th>Execute Job</th>
</tr>
</thead>
<tbody>
{% for c_jobs in component_jobs%}
<tr>
<td>{{c_jobs.name}} </td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{%endfor%}
</tbody>
</table>
</div>
{%endfor%}
</div>
如错误所述,此代码 returns 一个 TreeQuerySet 对象。
components = Component.objects.all()
尝试调用 price
之类的字段将导致相同的错误。
components = Component.objects.all()
Component_jobs = components.price.all()
此代码之所以有效,是因为它是在特定组件而不是组件集合上调用的。
component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()
要获取查询集上的所有作业,请尝试使用 queryset api reference
中的.values('jobs')
all_jobs = Component.objects.all().values('jobs')
假设您想要在一个循环中显示所有组件,然后在一个嵌套循环中显示每个组件的所有相关作业,您的模板应该类似于这个简化示例
{% for component in components %}
{{ component }}
{% for job in component.jobs.all %}
{{ job }}
{% endfor %}
{% endfor %}
然后您应该使用 prefetch_related
在单个查询中获取所有组件的所有相关作业。无需查询您认为的职位
components = Component.objects.all().prefetch_related('jobs')