动态扩展Django数据库?

时间:2018-05-28 07:19:23

标签: django django-models django-forms

我正在Django构建一个应用程序,允许用户在他们的个人资料中添加项目,例如以前的工作经验。我遇到的问题是不同的用户有不同的经验。我目前的方法是建立一个类似于:

的模型
class MyModel(models.Model):
    owner = models.ForeignKey(User, related_name='modelowner', on_delete=models.CASCADE)
    experience1_company = models.TextField(null=True, blank=True)
    experience2_company = models.TextField(null=True, blank=True)
    experience3_company = models.TextField(null=True, blank=True)
    ...
    experience10_company  = models.TextField(null=True, blank=True)
    experience1_title = models.TextField(null=True, blank=True)
    experience2_title = models.TextField(null=True, blank=True)
    experience3_title = models.TextField(null=True, blank=True)
    ...
    experience10_title  = models.TextField(null=True, blank=True)

在我目前的模型中,用户最多可以输入10个以前的角色,这些角色覆盖了大约95%以上的用户。然而,这显然存在用户输入的每个先前体验具有许多其他五个属性(开始日期,结束日期,标题,描述,位置)的问题。这意味着该模型最终会有60个属性......如果我需要添加新内容,我必须添加10次。

问题:有没有办法为拥有超过X个经验的用户动态构建新的模型属性,或者最好的做法是在模型中明确定义每个属性并且只是实际截止(例如,你可以只输入10)?

2 个答案:

答案 0 :(得分:2)

您必须更改模型才能代表以下体验:

 Insert INTO tablename
 select substring_index('1|2|ABC','|',1),
        substring_index(substring_index('1|2|ABC','|',2),'|',-1),
        substring_index('1|2|ABC','|',-1);

现在,您可以为每个用户创建无限制的class Experience(models.Model): owner = models.ForeignKey(User, on_delete=models.CASCADE) company = models.TextField(null=True, blank=True) title = models.TextField(null=True, blank=True) # and as much other fields as you like: start_date = models.DateField() end_date = models.DateField() description = models.TextField(null=True, blank=True) location = models.TextField(null=True, blank=True) 个实例,并使用以下命令获取它们

Experience

user = User.objects.get(username='bob')

Experience.objects.filter(owner=user)

有关此主题的文档位于Making queries - following relationships "backward"

答案 1 :(得分:0)

您需要一个模型来存储工作体验信息,例如(job_title,company_name,start_date,end_date,职责),并将此工作体验模型链接到用户配置文件。如下所示:

class WorkExperience(models.Model):
    person = models.ForeignKey(User, blank=True, null=True)
    job_title = models.CharField(max_length=125)
    company_name = models.CharField(max_length=125)
    start_date = models.DateField()
    end_date = models.DateField()
    duties_description = models.CharField(max_length=125)

这样,您的应用程序可以容纳任意数量的每个用户WorkExperience