Tôi đang đối mặt với một vấn đề rất lạ trong một trong các dự án django của tôi. Trong dự án của tôi, tôi có một lớp trường tùy chỉnh xử lý các khóa ngoài, một đến một và nhiều trường mô hình 2 nhiều. Lớp học là một số thứ như sau.Thuộc tính của trường tùy chỉnh Django tạo truy vấn cơ sở dữ liệu
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
Gần đây trong khi tôi đang chơi với django-toolbar, tôi phát hiện ra một trong những trang mà có một mẫu với các lĩnh vực nêu trên được ridiculously làm nhiều truy vấn cho các đối tượng tương tự một lần nữa và một lần nữa.
Trong khi gỡ lỗi, tôi phát hiện ra phương pháp prepare_value
đã được gọi là một lần nữa và một lần nữa. Sau khi một số gỡ lỗi nhiều hơn, tôi nhận ra thủ phạm là mẫu. Tôi có một mẫu chung mà tôi sử dụng cho các hình thức, Nó trông giống như sau:
{% 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 %}
Trong đoạn mã trên, mỗi câu lệnh if
gọi là lớp lĩnh vực mà các cuộc gọi prepare_value
phương pháp mà sau đó làm cho các truy vấn cơ sở dữ liệu. Mỗi một trong những điều sau đây được liệt kê là tạo truy vấn cơ sở dữ liệu, tôi hoàn toàn mất đi lý do tại sao điều này xảy ra và không có đầu mối về bất kỳ giải pháp nào. Bất kỳ trợ giúp, đề xuất sẽ được thực sự đánh giá cao. Cảm ơn.
- field.is_hidden
- field.field.required
- field.label
- field.label_tag
- lĩnh vực
- field.field.widget.attrs.help_text
- lĩnh vực. lỗi
Ngoài ra, tại sao t sự kiện của anh ta chỉ xảy ra với lớp tùy chỉnh của tôi, các trường khác (FK, O2O, M2M) trong ứng dụng và quản trị viên ứng dụng, chỉ cần thực hiện một truy vấn, mặc dù chúng đang sử dụng một khuôn mẫu tương tự.
Bạn đang sử dụng phiên bản django nào? – aquavitae
Phiên bản Django - (1, 5, 5, 'cuối cùng', 0) – Amyth