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

时间:2010-03-20 04:00:11

标签: python django models

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

我似乎已经把这个连接起来,以便我可以创建任意数量的Template对象,但我正在努力如何在这些模板中创建实例 - 实际内容对象。例如,我可以为客户“Acme”定义模板“基本页面”,其中包含“标题”和“正文”字段,但我还没有想出如何创建可填写这些字段的基本页面实例。

这是我的(有些省略的)模特......

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()

提前感谢任何建议!

4 个答案:

答案 0 :(得分:1)

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

ContentObject(models.Model):
    ...
    fields_content = models.ManyToManyField(Field, through=FieldContent)
    ...

然后:

class FieldContent(models.Model):
    field = ForeignKey(Field)
    content_object = ForeignKey(ContentObject)
    content = CharField

然后你应该确定,可能使用pre_save信号,对于给定的ContentObject实例,只有实例模板中的字段可以转到FieldContent表。

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

FieldContent.objects.create(field=your_field, content_object=your_content_object, content=content_given_by_the_customer)

答案 1 :(得分:0)

它只会是:

my_customer.templates.add(my_template)

其中my_customermy_template分别是CustomerTemplate的实例。

请参阅the documentation for related objects

答案 2 :(得分:0)

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

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

再次感谢!

答案 3 :(得分:0)

为了扩展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 =无论).fieldcontent_set.get(无论).get_component()。specific_component_field

要创建新的字段实例,您可能需要向Field模型添加辅助方法,例如:

    def create_content(self, content_object):
        return self.component.get_class().objects.create(
          content_object=content_object, field=self)

有一点需要注意的是,所有这些东西确实倾向于让你与框架作斗争,Django曾经为你做的一切事情(表格,管理员等)突然变成了一些工作来解决。可能值得研究一些现实生活项目如何处理它,Django-cms(django-cms.org)可能是一个良好的开端。

只是一个警告:我没有测试过这篇文章中的任何代码,因为我没有安装任何有用的计算机,但通常应该没问题。