-1

针对@Todor 的评论进行了大量编辑。

[我使用 Django 1.7.6 和 Python 3.4.1。]

——</p>

因此,在我的 Django 项目中,我定义了一个Item具有各种特定子类模型的模型。我还定义了一个Category模型。我的模型的玩具版本如下所示:

模型.py

from django.db import models

class Item(models.Model):
    name = models.CharField()

class CleeseItem(Item):
    cleese = models.URLField()

class GilliamItem(Item):
    gilliam = models.IntegerField()

class JonesItem(Item):
    jones = models.EmailField()

class Category(models.Model):
    title = models.CharField()
    item_types = ????  # List of model classes

现在,????以上是我的问题。对于每个Category实例,我想关联一个Item子类列表。不是单个Item实例,而是Item 子类

示例:假设我创建了一个特定的Category实例<Category: terry>。现在我想告诉 DjangoGilliamItemJonesItem子类属于 "terry" Category

——</p>

我将如何使用它?我想写一个视图如下:

视图.py

from django.shortcuts import render_to_response, get_object_or_404
from monty.models import Category

def category_page(request, cat_name):
    c = get_object_or_404(Category, name=cat_name)
    item_dict = {}
    for it in c.item_types:  # Recall item_types is a list of classes
        item_dict.update( {it.verbose_name_plural: it.objects.all()} )
    return render_to_response('category_page.html', {'items': item_dict})

即,我的视图(1)检索一个Category对象;(2) 构造一个字典,其中键是与之关联的模型的名称,Category值是包含这些模型的所有实例的查询集;(3) 将该字典提供给模板。

示例:我访问http://domain.com/category/terry/. 视图从数据库中检索Category对象。在第 7 行产生,所以字典最终看起来像name='terry'c.item_types[GilliamItem, JonesItem]{ 'gilliam items': GilliamItem.objects.all(), 'jones items': JonesItem.objects.all() }.

——</p>

最后,我希望站点管理员能够通过管理站点任意重新安排Category对象和Item类型之间的映射。(例如:有一天我可能会决定编辑“特里”以从Category中删除,并可能添加。)JonesItemitem_typesPratchettItem

4

2 回答 2

1

看看django-polymorphic。它为继承的模型提供外键和多对多关系。

于 2015-03-18T07:44:12.147 回答
0

正如我所怀疑的,我正在使用ContentTypesframework取得进展。特别是,如果我编辑我的Category模型看起来像

from django.contrib.contenttypes.models import ContentType

class Category(models.Model):
    title = models.CharField()
    item_types = models.ManyToManyField(ContentType, null=True, blank=True)

我几乎得到了我想要的。唯一剩下的问题是这会唤起我项目中的所有模型类,而我只对Item. 但我越来越近了!

于 2015-03-18T19:58:35.790 回答