私は部品データベースに取り組んでいます。ここでは、すべての部品番号をアセンブリにすることもできます。つまり、任意の数の他の部品で構成されています (さらにループを続けることができ、サブ部品はさらに多くの部品で構成されています)。そのため、2 つのデータベース テーブルがあり、1 つは部品情報用で、もう 1 つは関係情報 (「サブ部品」番号にリンクされた部品番号) 用です。「アセンブリ」、「パーツ」、および「サブパーツ」はすべて、最終的には単なる「パーツ」であることに注意してください (ちょっと混乱しますが、より DRY で汎用性の高いデータベースが可能になります)。
現在、select_related 呼び出しを使用して、モデルで使用されている ForeignKeys を追跡しています。ただし、私のクエリは 1 つ以上の結果を返す可能性があるため (複数のサブパーツの場合)、"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>
助けてくれてありがとう