Группировка имен полей модели в Django
У меня есть сложное детальное представление, в котором множество разнообразных данных отображается динамически. Моя модель имеет сотни полей, многие из которых связаны друг с другом. Я хотел бы иметь возможность группировать некоторые из этих полей для выполнения запросов. Есть ли способ сделать это?
Для того, чтобы выбрать определенные поля и сгруппировать их, мой текущий подход заключается в использовании расширений слов к именам полей, которые являются общими для каждой группы. Например, имена полей типа:
ampicillin = models.CharField(...)
ciprofloxacin = models.CharField(...)
...
становиться:
ampicillin_antimicro = models.CharField(...)
ciprofloxacin_antimicro = models.CharField(...)
...
Идея заключается в том, чтобы создать список имен полей и получить доступ к определенным группам полей с помощью подстрочного поиска. Как мне это сделать? Ниже приводится краткое изложение моих попыток и проблем на данный момент.
Использование _meta
Я могу получить доступ к необработанной информации об имени поля модели, используя _meta:
all_fields = []
for field in MyModel._meta.fields:
all_fields.append(field)
Это дает список вида:
[<django.db.models.fields.CharField: ampicillin_antimicro>,
<django.db.models.fields.CharField: ciprofloxacin_antimicro>, ...]
однако я не смог понять, как извлечь из этого нужную мне информацию.
Использование _meta и field.get_attname_column()[0]
Я могу составить список объектов имен полей в виде строк:
field_names = []
for field in MyModel._meta.fields:
newfield = field.get_attname_column()[0]
field_names.append(newfield)
Это дает дополненный список для имен полей:
['ampicillin_antimicro', 'ciprofloxacin_antimicro', ...]
Добавление подстрочного поиска позволяет получить нужное мне подмножество имен полей. Например, используя поисковую строку "antimic":
field_names = []
search_string = "antimic"
for field in Bacteria._meta.fields:
newfield = field.get_attname_column()[0]
if search_string in newfield:
field_names.append(newfield)
успешно изолирует имена полей, содержащие "расширение группового слова". Все хорошо, но я больше не могу получить доступ к фактическому значению имен полей - только само имя поля. При итерации списка в шаблоне возвращается только имя поля.
<li>
{% if field_names %}
<i style="color: blue"><b>A</b>ntibiotic tolerance:</i>
{% for f in field_names %}
{{f|default_if_none:''}}
{% endfor %}
{% endif %}
</li>
Использование кортежей и словарей
Если я туплифицирую и диктую список и пытаюсь использовать полученный словарь:
field_names = []
field_names_dict = dict(zip(field_names, field_names))
field_names_tuple = tuple(field_names_dict)
for key, val in field_names_tuple.items():
if val is not None:
field_names.append(val)
Я все еще получаю имя как результат, а не значение.
Словари с жестким кодом
Пока что единственное, что работает, это жесткое кодирование определенного словаря для каждого запроса в детальном представлении:
model = Model.objects.all()
antibiotics = []
antibiotics_dict = {'amp': model.ampicillin_antimicro,
'cipro': model.ciprofloxacin_antimicro, ...}
for key, val in antibiotics_dict.items():
if val is not None:
antibiotics.append(val)
Хотя это работает хорошо, это становится сложным, когда словари становятся большими, и мне не нравится идея жесткого кодирования пар ключ-значение. Мне кажется, что я очень близок к решению, но я явно что-то упускаю, потому что я новичок в кодировании. Может ли кто-нибудь помочь? Будьте здоровы.