Группировка имен полей модели в 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)

Хотя это работает хорошо, это становится сложным, когда словари становятся большими, и мне не нравится идея жесткого кодирования пар ключ-значение. Мне кажется, что я очень близок к решению, но я явно что-то упускаю, потому что я новичок в кодировании. Может ли кто-нибудь помочь? Будьте здоровы.

Вернуться на верх