0

我不确定为这项任务设计模型的最佳方式。四处搜索表明我需要使用 Django-MPTT 之类的东西。

我正在创建一个列表应用程序,其中任何“项目”都可以列在多个类别下。从任何类别中,我都需要能够查询匹配的“项目”。

一个例子应该能更好地说明我想要什么。

我有一个Item1将分配给两个子类别。

TopLevel1
   --- Sublevel1
   --- Sublevel2
           -----> Item1

TopLevel1
   --- Sublevel1
          ------> Item1
   --- Sublevel2

谁能建议应该如何构建模型/关系?我目前的实现

class Category(models.Model):
    name = models.CharField(max_length=128, blank=False)
    parent = models.ForeignKey('self', null=True, blank=True)


class Item(TimeStampedModel):
    name = models.TextField(null=False, blank=False)
    categories = models.ManyToManyField(Category)

感觉不像是正确的解决方案?

4

1 回答 1

1

我是这样看的...

您的模型看起来很接近,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 %}

并访问子级别类别,您循环遍历children.all()每个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 %}

您还可以获得一个类别中的所有项目

{% 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')

您可以通过相关管理添加一个Category categoriesItem

item_one.categories.add(category_one, category_two)

或者您可以通过相关经理添加ItemitemsCategory

category_one.items.add(item_one)
于 2013-05-12T22:07:50.390 回答