我正在研究一个零件数据库,其中每个零件号也可以是一个组件,这意味着它由任意数量的其他零件组成(并且循环可以继续,子零件由更多零件组成,等等)。所以有两个数据库表,一个用于零件信息,另一个用于关系信息——一个零件号链接到它的“子零件”号。请记住,“组件”、“零件”和“子零件”最终都只是“零件”(有点令人困惑,但它允许更干燥和通用的数据库)。
我目前正在使用 select_related 调用来跟踪我的模型中使用的 ForeignKeys。但是,因为我的查询可能返回的不仅仅是一个结果(如果有多个子部分),我不能使用“get”查找,而是使用“filter”。所以-我无法遵循文档中显示的示例,这些示例都基于 get 查询。
select_related 查询似乎正在获取我想要的内容(基于 DjangoDebugToolbar 显示的原始 SQL 查询)。但是,我不知道怎么称呼它!显示相关表中的值的正确语法或方法是什么?如何遍历返回的查询集中的每个实例?下面的模板片段应该最有效地显示我想要获得的结果。谢谢。
#----------------
#MODEL SNIPPET
#----------------
class Part(models.Model):
ISC_CHOICES = ( #intentionaly removed for this question
)
part_no = models.CharField(max_length=15, primary_key=True)
description = models.CharField(max_length=40, blank=True, null=True)
isc = models.CharField(max_length=2, choices=ISC_CHOICES)
rev = models.CharField(max_length=2, blank=True, null=True)
#this table relates subparts to the part model above- basically is a manual many-to-many field
class PartAssembly(models.Model):
id = models.AutoField(primary_key=True)
part_no = models.ForeignKey(Part, related_name="partno_set")
subpart = models.ForeignKey(Part, related_name="subpart_set")
qty = models.IntegerField(max_length=3)
item_no = models.IntegerField(max_length=3)
#----------------
#VIEW SNIPPET
#----------------
def assembly_details(request, assembly_no): #assembly_no passed through URL
context_instance=RequestContext(request)
subpart_list = PartAssembly.objects.filter(part_no=assembly_no).select_related()
return render_to_response('assembly_details.html', locals(), context_instance,)
#-------------------
# TEMPLATE SNIPPET
#-------------------
{% for partassembly in subpart_list %}
# obviously, this loop doesnt return anything for my part.foo variables below
# it does work for the partassembly.bar
<tr>
<td>{{ partassembly.item_no }}</td> #EDIT: comments are correct
<td>{{ partassembly.subpart }}</td> #partassembly.subpart.part_no
<td>{{ part.description }}</td> #partassembly.subpart.description
<td>{{ part.rev }}</td> #partassembly.subpart.rev
<td>{{ partassembly.qty }}</td>
<td>{{ part.isc }}</td> #partassembly.subpart.isc
</tr>
谢谢你的帮助