динамическое добавление полей в модели django

#django-models #field #dynamic

#django-модели #поле #динамическое

Вопрос:

У меня есть модель 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. Почему вес должен быть CharField ?

2. я грубо ввожу эти поля.. хочу сосредоточиться на динамических полях…

3. Я почти уверен, что динамические поля — это не то, что вы ищете. Есть ли у вас какие-либо примеры того, что вы хотите добавить в зависимости от категории, вида, типа?

4. да, у меня есть … species = Млекопитающие, category = Собаки и type = Лабрадор ретривер,

5. теперь я хочу разные поля для «Лабрадор ретривер», или, если ввести категорию = Птицы, а затем выбрать попугаев, тогда я хочу динамически добавлять поле «Говорящие попугаи»

Ответ №1:

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

Что вам нужно, так это структура таблицы базы данных, которая может хранить определения различных типов и связанные с ними записи… На этом этапе вам, вероятно, потребуется изменить структуру таблицы вашей базы данных…

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

 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 — это базовая таблица записей для типов питомцев, поэтому вы будете определять каждого питомца в этой таблице, дополнительное поле покажет, какие дополнительные поля будут отображаться в каждой записи. Не забывайте, что в этих таблицах будут записаны базовый тип и дополнительная структура, а не записи добавленных животных..

Таким образом, такая запись может содержать информацию, подобную:

Тип животного: млекопитающее, собака, лабрадор-ретривер, additional_info = [цвет, вес]

В котором говорится, что любая собака, записанная как лабрадор-ретривер, будет иметь информацию о цвете и весе…

Для каждого Labrador Recreiver, записанного в базу данных, данные будут записываться в эти таблицы:

 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
  

Итак, когда вы создаете новую элементарную запись, вы определяете тип элемента и добавляете имена каждого дополнительного поля данных в AdditionalFields. В вашей новой форме записи pet вы сначала получите тип pet, а затем получите все дополнительные информационные данные из таблицы AdditionalFields. Пользователь введет имя питомца после того, как он / она выберет тип, затем добавит информацию о цвете и весе (из примера выше). Вы получите эту информацию из формы и создадите запись в таблице pet и добавите каждую конкретную информацию об этой записи в таблицу petSpecifications…

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

Комментарии:

1. Это был быстрый ответ, поэтому, если он покажется сложным и труднодоступным для понимания, я попытаюсь объяснить его более конкретно. Извините за это.