将模型类Django与另一个模型的实例相关联



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

[我使用Django 1.7.6和Python 3.4.1.]

--

因此,在我的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>。现在我想告诉Django,GilliamItemJonesItem子类属于"terry"Category

--

我将如何使用这个?我想写一个观点如下:

视图.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相关联的模型的名称,并且值是包含这些模型的所有实例的QuerySet;以及(3)将该字典提供给模板。

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

--

最后,我希望站点管理员能够通过管理站点任意重新排列Category对象和Item类型之间的映射(例如:有一天我可能会决定编辑"Terry"Category,从item_types中删除JonesItem,也许还会添加PratchettItem。)

看看django多态性。它为继承的模型提供了外键和多对多关系。

正如我所怀疑的,我正在使用ContentTypes框架取得进展。特别是,如果我编辑我的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的子类感兴趣。但我已经接近了!

相关内容

  • 没有找到相关文章

最新更新