【发布时间】:2013-12-15 06:59:05
【问题描述】:
我在我的一个 django 项目中遇到了一个非常奇怪的问题。在我的项目中,我有一个自定义字段类来处理外键、一对一和多 2 个模型字段。该类类似于以下内容。
from django import forms
class CustomRelatedField(forms.Field):
def __init__(self, model, limit=None, multiple=False, create_objects=True, *args, *kwargs):
self.model = model
self.limit = limit
self.multiple = multiple
self.create_objects = create_objects
super(CustomRelatedField, self).__init__(*args, **kwargs)
def clean(self, value):
""" Calls self.get_objects to get the actual model object instance(s)
from the given unicode value.
"""
# Do some value processing here
return self.get_objects(value)
def get_objects(self, values):
""" Returns the model object instances for the given unicode values.
"""
results = []
for value in values:
try:
obj = self.model.object.get_or_create(name=value)[0]
results.append(obj)
except Exception, err:
# Log the error here.
return results
def prepare_value(self, value):
""" Returns the value to be sent to the UI. The value
passed to this method is generally the object id or
a list of object id's (in case it is a many to many object).
So we need to make a database query to get the object and
then return the name attribute.
"""
if self.multiple:
result = [obj.name for obj in self.model.filter(pk__in=value)]
else:
result = self.model.object.get(pk=value)
return result
最近在玩django-toolbar 时,我发现其中一个具有上述字段的表单的页面正在荒谬地一次又一次地对同一个对象进行多次查询。
在调试时,我发现prepare_value 方法被一次又一次地调用。经过一番调试,我意识到罪魁祸首是模板。我有一个用于表单的通用模板,如下所示:
{% for field in form %}
{% if field.is_hidden %}
<!-- Do something here -->
{% endif %}
{% if field.field.required %}
<!-- Do something here -->
{% endif %}
<label>{{ field.label }}</label>
<div class="form-field">{{ field }}</div>
{% if field.field.widget.attrs.help_text %}
<!-- Do something here -->
{% elif field.errors %}
<!-- Do something here -->
{% endif %}
{% endfor %}
在上面的代码中,每个if 语句调用字段类,该字段类调用prepare_value 方法,然后进行数据库查询。以下列出的每一个都在进行数据库查询,我完全不知道为什么会发生这种情况,并且不知道任何解决方案。任何帮助,建议将不胜感激。谢谢。
- field.is_hidden
- field.field.required
- field.label
- field.label_tag
- 字段
- field.field.widget.attrs.help_text
- field.errors
另外,为什么只有我的自定义字段类会发生这种情况,应用程序中的其他字段(FK、O2O、M2M)和应用程序管理员只需进行一次查询,即使它们使用类似的模板。
【问题讨论】:
-
你使用的是什么版本的 django?
-
Django 版本 - (1, 5, 5, 'final', 0)
标签: database django custom-fields