Django:根据模型的值返回模型中的一系列字段?

时间:2010-05-20 15:58:14

标签: django

我正在处理一些我无法控制的数据。我只想返回我的模型中不是某些“无趣”值的字段(例如“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") 

在我的模板中,我返回了一个Manors的QuerySet,我想输出类似的内容,如果丘陵场不是无趣的话:

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

我想在模板中避免太多逻辑。理想情况下,庄园对象根本不会返回附加不感兴趣的字段,然后我就可以{% if manor.hills %}

---- UPDATE ----我可以使用字典,如下所示,但感觉非常低效 - 最好只返回附带有趣字段的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。有一个更好的方法吗?

UPDATE :最后,它作为模型上的方法完成了。

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 :(得分:0)

试试这个......

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

假设模型方法有效,那应该可以得到你想要的东西。

答案 1 :(得分:0)

根据您使用的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))