#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. Это был быстрый ответ, поэтому, если он покажется сложным и труднодоступным для понимания, я попытаюсь объяснить его более конкретно. Извините за это.