动态地向django模型添加字段

时间:2011-04-18 07:31:02

标签: django-models field dynamic

我有一个Pet的模型,看起来像

class Pet(models.Model):

 STATUS_CHOICES=(
     (1,'Listed for sale'),
     (2,'Dead'),
     (3,'Sold'),
 )
 name = models.CharField(_("name"), max_length=50 )
 species = models.ForeignKey(PetSpecies, related_name = "pets")
 pet_category = models.ForeignKey(PetCategory, related_name = "pets")
 pet_type = models.ForeignKey(PetType, related_name = "pets") 

 # want to add dynamic fields here depends on above select options(species, category, type)

 color = models.CharField(_("color"), max_length=50, null=True, blank=True)
 weight = models.CharField(_("weight"), max_length=50, null=True, blank=True)

我看过Dynamic Models,对我有帮助吗?或者我应该做别的事吗?如果有人知道,请用一段代码指导我。

谢谢:)

1 个答案:

答案 0 :(得分:1)

实际上,您分享的链接并不是您所需要的......

您需要的是一个数据库表结构,可以存储不同类型的定义和与它们相关的记录......在这一点上,您可能需要更改数据库表结构... < / p>

首先,您可以定义一个表格来存储类别标签,例如

class PetTyper(models.Model):
    specy = models.ForeignKey(...)
    category = models.ForeignKey(...)
    type = models.Foreignkey(...)
    ...
    additional_fields= models.ManyToManyField(AdditionalFields)

class AdditionalFields(Models.Model):
    label = models.CharField(_("Field Label")

PetTyper是宠物类型的基本记录表,因此您将在此表中定义每个宠物,附加字段将显示将在每个记录上显示哪些额外字段。不要忘记这些表将记录基本类型和其他结构,而不是记录添加的动物..

所以这样的记录可能包含如下信息:

pettYpe:哺乳动物,狗,拉布拉多犬,additional_info = [颜色,体重]

这告诉你任何记录为LAbrador Retreiver的狗都会有颜色和重量信息......

对于记录在数据库中的每个Labrador Retreiver,都会将数据记录到这些表中:

class Pet(models.Model):
    name = models.CharField(...)
    typer = models.ForeignKey(PetTyper) # this will hold records of type, so no need for specy, category and type info in this table
    ... # and other related fields

class petSpecifications(models.Model):
    pet = Models.ForeignKey(Pet) # that data belongs to which pet record
    extra_data_type = Models.ForeignKey(AdditionalFields) # get the label of the extra data field name
    value = models.CharField(...) # what is that extra info value

因此,当您创建一个新的宠物条目时,您将定义一个petTyper并将其他每个字段数据的名称添加到AdditionalFields。在您的新宠物记录表格中,您将首先获得宠物typer,然后从AdditionalFields表中获取每个附加信息数据。用户在选择类型后输入宠物名称,然后添加颜色和重量信息(来自上面的exapmle)。您将从表单中获取这些信息并在宠物表上创建记录,并将有关该记录的每个特定信息添加到petSpecifications表中......

这种方式很难,你不能使用一些基本的django功能lke表单形式模型等。因为你从PetTyper和AdditionalFields表读取数据并通过这些信息破坏你的表单。并将发布的信息记录到宠物和宠物规格表......