Странное поведение модуля djangoql
Мы используем djangoql для удобного поиска в нашей админ-панели django. Миксин DjangoQLSearchMixin был добавлен к некоторым нашим моделям в панели администратора. И иногда после развертывания мы получаем ошибку в обработчике application_name/model_name/introspect/
Ошибка:
FieldDoesNotExist в /admin/user/user/introspect/ Имя_модели не имеет поля с именем 'имя_поля'
После перезагрузки ошибка исчезает. Ошибка не может быть воспроизведена локально.
Пример: "Адрес не имеет поля с именем 'membership_requests'"
@admin.register(MembershipRequest, site=admin_site)
class MembershipRequestAdmin(DjangoQLSearchMixin, admin.ModelAdmin):
list_display = ("company", "user", "request_type", "status", "created_on", "updated_on")
class MembershipRequest(PureModelMixin):
company = models.ForeignKey("constrafor.Company", on_delete=models.CASCADE, related_name="membership_requests")
user = models.ForeignKey("user.User", on_delete=models.CASCADE, related_name="membership_requests")
address = models.OneToOneField(
"constrafor.Address",
related_name="membership_requests",
on_delete=models.CASCADE,
null=True,
blank=True,
help_text="FK to constrafor.Address",
)
code = models.ForeignKey(
"constrafor.Code", on_delete=models.SET_NULL, related_name="membership_requests", blank=True, null=True
)
company_name = models.CharField(null=True, blank=True, max_length=1000)
company_phone = models.CharField(null=True, blank=True, max_length=15)
company_type = models.CharField(max_length=15, choices=Company.COMPANY_TYPE_CHOICES)
is_needed_email_verification = models.BooleanField(default=False)
status = models.CharField(
max_length=8,
choices=MembershipRequestStatus.choices,
default=MembershipRequestStatus.pending,
)
request_type = models.CharField(
max_length=10,
choices=MembershipRequestType.choices,
default=MembershipRequestType.natural,
)
Как я заметил в предыдущем комментарии к вашему вопросу, это, похоже, очень хитрый heisenbug. Не имея возможности должным образом отладить его, поскольку его невозможно воспроизвести, я нашел способ обойти его:
class CustomDjangoQLSchema(DjangoQLSchema):
def get_field_instance(self, model, field_name):
"""Some obscure heisenbug caused introspect requests to raise, rendering DjangoQL useless.`
This catch the exception and just skip the problematic field.
"""
try:
return super().get_field_instance(model, field_name)
except FieldDoesNotExist:
return None
Если вы используете эту схему вместо схемы по умолчанию, вы сможете пропустить эти неудачные поля.
UPDATE: Позже я обнаружил, что модель, которая вызвала проблемы, не была зарегистрирована в Django должным образом. Логично, что модель, не импортированная в models.__init__, но имеющая направление, вызывает неожиданное поведение, подобное этому.