【问题标题】:Strange module behavior djangoql奇怪的模块行为djangoql
【发布时间】:2022-11-14 13:09:26
【问题描述】:

我们使用 djangoql 在我们的 django 管理面板中轻松搜索。 mixin DjangoQLSearchMixin 已添加到管理面板中的一些模型中。 有时在部署后我们会在处理程序中遇到错误 application_name/model_name/introspect/

错误:

FieldDoesNotExist 在 /admin/user/user/introspect/ Model_name 没有名为“field_name”的字段

重新启动后,错误消失。该错误无法在本地重现。

例子: “地址没有名为‘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,
    )

【问题讨论】:

  • 也遇到了这个,似乎是一个黑森错误:当你尝试研究它时它消失了。因此,您无法在本地复制它。它消失了一段时间,然后毫无逻辑地回来了。

标签: django django-admin


【解决方案1】:

正如我在之前对您的问题的评论中所说,这似乎是一个非常棘手的 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

如果您使用此模式而不是默认模式,您应该能够跳过那些失败的字段。

更新:后来我发现导致问题的模型没有正确注册到Django。没有在models.__init__ 中导入但确实有引用的模型会导致这样的意外行为,这是有道理的。

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2021-11-08
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多