Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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_Models - Fatal编程技术网

Python 如何在Django中创建相关模型的实例

Python 如何在Django中创建相关模型的实例,python,django,models,Python,Django,Models,我正在开发一个CMSy应用程序,为此我实现了一组模型,允许创建自定义模板实例,由多个字段组成,并与特定客户绑定。最终目标是,可以通过管理界面定义一个或多个带有一组自定义字段的模板,并将其与客户关联,这样客户就可以按照模板规定的格式创建内容对象 我似乎已经将其连接起来,这样我就可以创建任意数量的模板对象,但我正在努力解决如何在这些模板中创建实例——实际的内容对象。例如,我可以为客户“Acme”定义一个模板“Basic Page”,该模板包含字段“Title”和“Body”,但我还没有弄清楚如何创建

我正在开发一个CMSy应用程序,为此我实现了一组模型,允许创建自定义模板实例,由多个字段组成,并与特定客户绑定。最终目标是,可以通过管理界面定义一个或多个带有一组自定义字段的模板,并将其与客户关联,这样客户就可以按照模板规定的格式创建内容对象

我似乎已经将其连接起来,这样我就可以创建任意数量的模板对象,但我正在努力解决如何在这些模板中创建实例——实际的内容对象。例如,我可以为客户“Acme”定义一个模板“Basic Page”,该模板包含字段“Title”和“Body”,但我还没有弄清楚如何创建可以填充这些字段的基本页面实例

以下是我的(略带省略的)模型

class Customer(models.Model):
    ...

class Field(models.Model):
    label = models.CharField(max_length=255)
    component = models.ForeignKey(ContentType, 
            limit_choices_to={'id__in': component_choices}
            )
    fields = models.Manager()

class Template(models.Model):
    label = models.CharField(max_length=255)
    clients = models.ManyToManyField(Customer, blank=True)
    fields = models.ManyToManyField(Field, blank=True)

class ContentObject(models.Model):
    label = models.CharField(max_length=255)
    template = models.ForeignKey(Template)
    author = models.ForeignKey(User)
    customer = models.ForeignKey(Customer)
    mod_date = models.DateTimeField('Modified Date', editable=False)
    def __unicode__(self):
        return '%s (%s)' % (self.label, self.template)
    def save(self):
        self.mod_date = datetime.datetime.now()
        super(ContentObject, self).save()
提前感谢您的建议

它只是:

my_customer.templates.add(my_template)
其中
my_customer
my_template
分别是
customer
template
的实例


请参见

如果我不清楚,很抱歉。问题在于如何基于模板创建实例,而不是如何创建模板

My Template类用于定义给定模板包含哪些字段以及客户可以使用哪些字段。我的ContentObject类旨在基于模板定义内容记录


再次感谢

如果要坚持使用此模型体系结构,则需要在ContentObject类中添加另一个字段,用于存储实际内容。可能是这样的:

ContentObject(models.Model):
    ...
    fields_content = models.ManyToManyField(Field, through=FieldContent)
    ...
FieldContent.objects.create(field=your_field, content_object=your_content_object, content=content_given_by_the_customer)
    def create_content(self, content_object):
        return self.component.get_class().objects.create(
          content_object=content_object, field=self)
然后:

class FieldContent(models.Model):
    field = ForeignKey(Field)
    content_object = ForeignKey(ContentObject)
    content = CharField
然后,您应该很明显地确保,可能使用pre_save信号,对于给定的ContentObject实例,只有实例模板中的字段才能进入FieldContent表

然后您可以通过以下方式创建实际内容:

ContentObject(models.Model):
    ...
    fields_content = models.ManyToManyField(Field, through=FieldContent)
    ...
FieldContent.objects.create(field=your_field, content_object=your_content_object, content=content_given_by_the_customer)
    def create_content(self, content_object):
        return self.component.get_class().objects.create(
          content_object=content_object, field=self)

要扩展pawartur的答案,有几种方法可以处理字段的多种(可能比较复杂)数据类型。您可以尝试的一种方法是使用模型继承,可能类似于:

class FieldContent(models.Model):
    field = models.ForeignKey(Field)
    content_object = models.ForeignKeyKey(ContentObject)
    def get_component(self):
        """Return the specific component instance for this field."""
        return self.field.get_object_for_this_type(pk=self.pk)
然后为每个字段类型组件继承此基础模型,例如:

class SomeComponent(FieldContent):
    # specific fields for the component here
然后,您可以执行以下操作: somecontentobject.get(id=whatever).fieldcontent\u set.get(whatever).get\u component().specific\u component\u字段

要创建新的字段实例,您可能需要向字段模型中添加一个helper方法,例如:

ContentObject(models.Model):
    ...
    fields_content = models.ManyToManyField(Field, through=FieldContent)
    ...
FieldContent.objects.create(field=your_field, content_object=your_content_object, content=content_given_by_the_customer)
    def create_content(self, content_object):
        return self.component.get_class().objects.create(
          content_object=content_object, field=self)
需要注意的一件事是,所有这类东西确实会让您与框架发生冲突,Django过去为您做所有事情(表单、管理等)的地方突然变成了需要整理的工作。也许值得一看一些实际项目是如何处理的,DjangoCMS(djangoCMS.org)可能是一个好的开始


只是一个警告:我没有测试这篇文章中的任何代码,因为我不是在一台安装了任何有用的东西的计算机上,但它通常应该是可以的。

谢谢,pawartur。这似乎是在正确的轨道上;但是,我已经有了存储实际内容的模型,并且该内容可以是具有多个属性的复杂对象,而不是单个字段。如果有帮助的话,我已经展示了更多的Field类;给定字段的基本内容模型在中表示为“组件”。很明显,需要有某种东西将每个字段及其内容链接到内容对象。。。以您的示例为例,是否有一种方法可以动态确定给定字段的正确实例类型?这个答案实际上只是问题的一个澄清点。您可能应该删除此答案并更新您的问题。