models.pyDjango的最好的外鍵查詢做法
class Category(models.Model):
name = models.CharField(max_length=50)
class SubCatergory(models.Model):
parent_category = models.ForeignKey(Category)
name = models.CharField(max_length=100)
views.py
def all_products(request):
c = Category.objects.all()
s = SubCatergory.objects.all()
return render_to_response('all_products.html',
{'c':c, 's':s})
all_products.html
{% for category in c %}
<h1>{{ category.name }}</h1>
<ul>
{% for sub in s %}
{% if category.id == sub.parent_category.id %}
<li>{{ sub.name }}</li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
只是想知道如果以上是外鍵的最佳實踐查詢。我在過濾模板級別(如果category.id ==子......),我應該提出這個模型或視圖的水平呢?
這是正確的想法,但請注意,Django自動爲你做這個。它會自動爲指向模型的每個外鍵創建一個「反向關係」,這是(如果您沒有明確更改它)相關模型的名稱加上「_set」。 請參閱以下鏈接以獲取更多信息: http://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects – vitorbal 2011-02-17 14:33:52
確實,django爲您提供了一個API來查詢反向關係。如果使用反向關係檢索相關模型,仍然會導致額外的SQL查詢,如果多次執行(即在循環中),這可能會造成巨大的性能下降。爲了避免這種情況,可能需要對關係進行非規範化,以便在上述情況下,可以在每個類別中保存對SubCategories的引用。 – heyman 2011-02-23 11:37:37