Странное поведение модуля 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__, но имеющая направление, вызывает неожиданное поведение, подобное этому.

Вернуться на верх