我有一个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,对我有帮助吗?或者我应该做别的事吗?如果有人知道,请用一段代码指导我。
谢谢:)
答案 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表读取数据并通过这些信息破坏你的表单。并将发布的信息记录到宠物和宠物规格表......