对@Todor的评论进行了大量编辑。
[我使用Django 1.7.6和Python 3.4.1。]
-
所以在我的Django项目中,我已经定义了一个具有各种特定子类模型的Item
模型。我还定义了Category
模型。我的模型的玩具版本看起来像:
models.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 GilliamItem
和JonesItem
子类属于&#34; terry&#34; Category
。
-
我将如何使用它?我想写一个如下视图:
views.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
相关联的模型的名称,值是包含这些模型的所有实例的QuerySets; (3)将该字典提供给模板。
示例:我访问http://domain.com/category/terry/
。该视图从数据库中检索Category
对象name='terry'
。第7行中的c.item_types
生成[GilliamItem, JonesItem]
,因此字典最后会显示为{ 'gilliam items': GilliamItem.objects.all(), 'jones items': JonesItem.objects.all() }
。
-
最后,我希望网站管理员能够通过管理网站随意重新排列Category
个对象和Item
类型之间的映射。 (示例:有一天,我可能会决定编辑&#34; Terry&#34; Category
从JonesItem
删除item_types
,并可能添加PratchettItem
。 )
答案 0 :(得分:1)
看看django-polymorphic。它为继承的模型提供了外键和多对多关系。
答案 1 :(得分:0)
我怀疑,我正在使用ContentTypes
framework取得进展。特别是,如果我将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
的子类感兴趣。但我越来越近了!