Django: Best way for simple hierarchy?
I have this model:
class Category(models.Model):
name = models.CharField()
description = models.CharField(blank=True)
parent = models.ForeignKey('self', blank=True, null=True)
I want Django to sort the categories with respect to their hierarchy, for example:
- Parent 1
- Child 1
- Parent 2
- Child 1
I did some research and found 2 apps, treebeard.al_tree and Django MPTT, both are powerful which may lead to lower performance or harder t开发者_StackOverflow中文版o maintain.
I will display the categories in website's sidebar and inside admin pages (includes ForeignKey in posts model), there will be very low additions/modifications/deletions to categories, mostly reading only which should have no big affect on performance.
Is there any other app which offers this and simpler than those above? Can I achieve this using Django without additional apps, using managers or something else?
I do not see any disadvantes using an app like django-mptt. In fact the methods provided by it are optimized to give you a maximum in performance when doing queries with hierarchical structures. No reason for me to worry about maintainability and/or performance and it is quite easy to use!
MPTT or treebeard may lead to lower performance? Nonsense. The whole point of these apps is that they provide highly optimised algorithms that massively increase performance. MPTT allows you to grab whole trees or sub-sections of them with a single database operation, which would otherwise need many separate calls.
Using MPTT is there to make the system perform. When you implement it yourself, you may end up connecting the nodes together manually (a ~30 line function), or doing individual queries for all sublevels. Lots of manual work, been there, done that.
With the MPTT algorithm, a subtree can be fetched in one query. It's a common algorithm to store hierarchical data.
Django MPTT (especially v0.4) has some nice API's to display all this data properly in the admin and templates. You don't have to reinvent the wheel.
精彩评论