динамически добавлять поля в модели Django - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть модель 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)

Я прочитал Динамические модели , было бы мне полезно?или я должен сделать что-то еще?если кто-нибудь знает, пожалуйста, направьте меня с кодом.

спасибо:)

1 Ответ

1 голос
/ 18 апреля 2011

На самом деле, ссылка, которой вы поделились, не то, что вам нужно ...

Вам нужна структура таблицы базы данных, которая может хранить определения различных типов и связанные с ними записи ... В этот момент вам, вероятно, потребуется изменить структуру таблицы базы данных ...

Сначала вы можете определить таблицу, в которой будут храниться метки категорий, например

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: млекопитающее, собака, лабрадор-ретривер, extra_info = [цвет, вес]

Что говорит о том, что у любой собаки, зарегистрированной как LAbrador Retreiver, будет информация о цвете и весе ...

Для каждого Лабрадора 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. В новой форме записи о домашних питомцах вы сначала получите тип домашнего животного, а затем получите информацию о каждой дополнительной информации из таблицы AdditionalFields. Пользователь будет вводить имя питомца после того, как он / она выберет тип, затем добавит информацию о цвете и весе (из примера выше). Вы получите эту информацию из формы, создадите запись в таблице домашних животных и добавите каждую конкретную информацию об этой записи в таблицу petSpecifications ...

Этот способ довольно сложен, и вы не можете использовать некоторые базовые функции django, например, формы форм и т. Д. Поскольку вы читаете данные из таблицы PetTyper и AdditionalFields и извлекаете из них свою форму. И записать опубликованную информацию в таблицу Pet и спецификации домашних животных ...

...