Джанго: возвращает выбор полей из модели на основе их значений? - PullRequest
1 голос
/ 20 мая 2010

Я работаю с некоторыми данными, над которыми у меня мало контроля. Я хотел бы вернуть ТОЛЬКО поля моей модели, которые не являются определенными «неинтересными» значениями (например, «0», «X» или «-»), и обращаться к ним по отдельности в шаблоне.

Моя модель такая:

class Manors(models.Model):
    structidx = models.IntegerField(primary_key=True, verbose_name="ID")    
    hills = models.CharField(max_length=100, null=True, blank=True, verbose_name="Number of fields") 

В моем шаблоне я возвращаю QuerySet of Manors, и я хотел бы вывести что-то вроде этого , если поле холмов неинтересно:

{% for manor in manors %}
{% if manor.hills %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}
{% endfor %}

Я хочу избежать слишком большой логики в шаблоне. В идеале объект поместья просто не должен возвращаться с присоединенными неинтересными полями, тогда я мог бы просто сделать {% if manor.hills %}.

---- ОБНОВЛЕНИЕ ---- Я мог бы использовать словарь, как показано ниже, но он кажется очень неэффективным - было бы лучше вернуть QuerySet только с интересными прикрепленными полями. Это возможно? -----------

Я попытался написать метод модели, который возвращает словарь интересных значений, например:

def get_field_dictionary(self):
    interesting_fields = {}
    for field in Manors._meta.fields:
        if field.value_to_string(self) != "N" and field.value_to_string(self) != "0" and field.value_to_string(self) != "-" and field.value_to_string(self) != "X":
            interesting_fields[field.name] = field.value_to_string(self)
    return interesting_fields

Но я не знаю, как получить доступ к отдельным значениям словаря в шаблоне:

{% if manor.get_field_dictionary['hills'] %}<li>Hills blah blah: {{ manor.get_field_dictionary['hills'] }}</li>{% endif %}

выдает TemplateSyntaxError. Есть лучший способ сделать это?

ОБНОВЛЕНИЕ : это было сделано в конце, как метод для модели.

def get_interesting_queryset(self):
    for field in Manors._meta.fields:
        if field.value_to_string(self) is None or field.value_to_string(self) == "N" or field.value_to_string(self) == "0" or field.value_to_string(self) == "-" or field.value_to_string(self) == "X" or field.value_to_string(self) == "":
            delattr(self, str(field.name))
    return self

Ответы [ 2 ]

0 голосов
/ 20 мая 2010

В зависимости от используемой версии Django, вы должны использовать оператор «in». Давайте возьмем вашу модель функции. Пусть он выведет список.

def get_field_list(self):
    interesting_fields = []
    for field in Manors._meta.fields:
        if field.value_to_string(self) != "N" and field.value_to_string(self) != "0" and field.value_to_string(self) != "-" and field.value_to_string(self) != "X":
            interesting_fields[] = field.value_to_string(self)
    return interesting_fields

Тогда. В вашем шаблоне сделайте следующее.

{% if 'hills' in manor.get_field_list %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}

Также обратите внимание, что когда у вас есть набор запросов IIRC, вы можете его редактировать. Таким образом

for manor in Manors.objects.all():
    for field in Manors._meta.fields:
        if field.value_to_string(manor) == "N" or field.value_to_string(manor) == "0" or field.value_to_string(manor) == "-" or field.value_to_string(manor) == "X":
            delattr(manor, field.value_to_string(self))
0 голосов
/ 20 мая 2010

Попробуйте это ...

{% for k,v in manor.get_field_dictionary %}
  {% ifequal k "hills" %}
    <li>Hills blah blah: {{v}}</li>
  {% endifequal %}
{% endfor %}

Предполагая, что метод модели работает, это должно дать вам то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...