Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将模型类Django与另一个模型的实例相关联_Python_Django_Django Models_Django Contenttypes_Generic Relations - Fatal编程技术网

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

Python 将模型类Django与另一个模型的实例相关联,python,django,django-models,django-contenttypes,generic-relations,Python,Django,Django Models,Django Contenttypes,Generic Relations,针对@Todor的评论进行了大量编辑 [我使用Django 1.7.6和Python 3.4.1。] - 因此,在我的Django项目中,我定义了一个带有各种特定子类化模型的项模型。我还定义了一个类别模型。我的模型的玩具版本如下所示: 型号.py from django.db import models class Item(models.Model): name = models.CharField() class CleeseItem(Item): cleese = mo

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

[我使用Django 1.7.6和Python 3.4.1。]

-

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

型号.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
现在,上面的
是我的问题。对于每个
类别
实例,我想关联一个
子类的列表。不是单个
Item
实例,而是
Item
子类

示例:假设我创建了一个特定的
类别
实例
。现在我想告诉Django,
GilliamItem
JonesItem
子类属于“terry”
类别

-

我怎么用这个?我想写一个观点如下:

视图.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)检索
类别
对象;(2) 构造一个字典,其中键是与该
类别关联的模型的名称,值是包含这些模型的所有实例的查询集;(3)将该字典提供给模板

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

-


最后,我希望站点管理员能够通过管理站点任意重新安排
类别
对象和
项目
类型之间的映射。(例如:有一天我可能会决定编辑“Terry”
类别
,从
项目类型
中删除
JonesItem
,或者添加
PratchettItem

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

正如我所怀疑的,我正在使用。特别是,如果我将我的
类别
模型编辑为

from django.contrib.contenttypes.models import ContentType

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

我几乎完全得到了我想要的。剩下的唯一问题是,这会调用我项目中的所有模型类,而我只对
Item
的子类感兴趣。但我快接近了

您计划如何向类别实例“添加子类”?从管理员那里?更重要的是,您计划如何/在哪里存储这些信息?最后,你打算如何使用它?如果
c=
,您希望如何使用
c
?例如,您希望
c.items.all()
仅从
GilliamItem
JonesItem
返回项目的
queryset
?或者你需要/想要更多的东西?如果是这样的话,那是什么?@Todor谢谢你提出这个问题-在试图回答这个问题的过程中,我在自己的头脑中澄清了很多问题。我对问题进行了重大更新,以解决您的问题,但简而言之:是的,我想通过管理员将子类分配给类别实例。不,我不想要一个大的多态查询集,而是一个包含适当的单个查询集的dict。我猜查询集可能是这样的:
ContentType.objects.filter(model\uu endswith='Item')