這是我看到它... ...
你的模型似乎接近中,M2M似乎是恰當的,但你的圖看起來更像是:
Item1
---> TopLevel1 (accessed through `categories`)
---> SubLevel1 (accessed through `Category.children`, see below)
---> SubLevel2 (accessed through `Category.children`, see below)
和你的模型看起來更像
class Category(models.Model):
name = models.CharField(max_length=128) # `blank` is false by default
parent = models.ForeignKey('self', null=True, blank=True, related_name='children') # by giving this field a nice `related_name`, we can easily access the linked categories
class Item(TimeStampedModel):
name = models.TextField() # `null` and `blank` are false by default
categories = models.ManyToManyField(Category, null=True, blank=True, related_name='items')
現在,如果你有一個項目,並希望得到它的頂級類別,可以遍歷item.categories.all()
{% for category in item.categories.all %}
Top Level: {{ category.name }}
{% endfor %}
和訪問子級類別,您在每個category
{% for category in item.categories.all %}
Top Level: {{ category.name }}
{% for child in category.children.all %}
Sub Level: {{ child.name }}
Parent: {{ child.parent.name }}
{% endfor %}
{% endfor %}
遍歷children.all()
你也可以得到所有項目的一個類別
{% for item in category.items.all %}
Item: {{ item.name }}
{% endfor %}
,或者如果你是在頂級類別
{% for child in category.children.all %}
{{ child.name }}
{% for item in child.items.all %}
Item: {{ item.name }}
{% endfor %}
{% endfor %}
並與
category_one = Category.objects.create('category one')
category_two = Category.objects.create('category two')
item_one = Item.objects.create('item one')
您可以add一個上Item
item_one.categories.add(category_one, category_two)
Category
通過related managercategories
或者你可以add的Item
通過相關經理items
上Category
category_one.items.add(item_one)
優秀的感謝。我會更詳細地閱讀,稍後再嘗試。這看起來正是我想要的。感謝您的詳細回覆。 – 2013-05-13 11:10:36
這似乎正是我想要的。我正在一些測試中對此進行試驗。爲了提高效率,類別模型子類MPTTModel和ForeignKeyField是否應該是TreeForeignKey? – 2013-05-13 21:28:37
@JT不幸的是,我對Django-MPTT一無所知,抱歉... – Ngenator 2013-05-13 21:45:26