2017-06-20 85 views
0

我有一个Django的模型,看起来像Django的扩展模型可选字段

class Person(models.Model): 
    name = models.CharField(max_length=100) 
    favorite_color = models.CharField(max_length=100) 
    favorite_candy = models.CharField(max_length=100) 

,我想做出一个模板模型吧。基本上,我想要一个模型,可以有任意数量的Person的字段填写。例如,假设我想为Person设置一个喜欢巧克力的模板 - 我会说类似chocolate_template = PersonTemplate(favorite_color='chocolate')的东西,如果我想要一个名字是杰拉德的人,我可以说gerald_template = PersonTemplate(name='Gerald')。我的想法是,我可以使用这些模板对象来预先填写一个Person创建表单。

我的主要问题是一个实现问题。这是完全可能的,我做像这样

class PersonTemplate(models.Model): 
    name = models.CharField(max_length=100, blank=True) 
    favorite_color = models.CharField(max_length=100, blank=True) 
    favorite_candy = models.CharField(max_length=100, blank=True) 

一个模板,但该代码是在我有手动复制粘贴Person类的内容太可怕了。这意味着如果我改变Person,我必须记得更新PersonTemplate。我想知道是否有一种更漂亮的方式来制作模型的“孩子”,其中所有字段都是可选的。将所有字段Person设置为blank=True并添加isTemplate字段也是否定的,因为PersonPersonTemplate应该是数据库中的两个不同实体。对此有何想法?

回答

1

当然:)

class PersonTemplate(Person): 
    field = models.CharField(max_length=100, blank=True) 

的是它意味着你必须从每个人字段,并且您可以PersonTemplate

添加更多的具体领域
class Person(models.Model): 

已经从型号,它为什么你有机会扩展到created,modified,id,pk ....

什么是好的它的PersonTemplate '扩展''扩展'模型的人。

由于Django的1.10可以overrride场这样的:

class PersonTemplate(Person): 
    favorite_color = models.CharField(max_length=100, blank=True) 
    favorite_candy = models.CharField(max_length=100, blank=True) 
+0

我可能问过我的问题太含糊,但我认为这个解决方案是有问题的。例如,说'人'模型要求所有字段都是必需的。假设我想要一个只有'name'设置的'Person'模板,其他字段为空。如果我扩展'Person',那么我就不能实例化PersonTemplate,因为剩下的必需字段'favorite_color'和'favorite_candy'是空白的,但仍然是必需的。 – mjkaufer

+0

我知道这个解决方案(请参阅我的问题),我想知道是否有任何方法可以制定更清洁的解决方案?这很容易,但是你必须复制粘贴一堆代码,这意味着当你编辑'Person'模型时,你必须返回并编辑'PersonTemplate'模型。我想知道是否有办法避免硬编码PersonTemplate。 – mjkaufer

+0

它不是相同的代码,我的例子从'Person'扩展,我认为覆盖'favorite_color'和'favorite_candy'以添加'blank = True'。所以你可以添加你想要的'PersonTemplate'它不会为'Person'改变,但是你可以添加字段到'Person',并且它们将被提供给'PersonTemplate'而不用你重新声明它们。在我的例子中,在'PersonTemplate'中有一个'name'字段 – MaximeK