Django 外键字段上的零值

发布于 2024-11-02 03:47:56 字数 154 浏览 0 评论 0原文

我正在研究设计非常糟糕的遗留数据库。在某些表上,外键不仅可以为空(这是可以的),也可以为 0。

我将这些表之一映射到一个模型,当表中为 Null 时,它返回所需的 None 值,但当该值为 0 时引发异常。

有没有办法让它在包含值 0 的外键上返回 None 。

I'm working on very badly designed legacy database. On some of the tables not only can the foreign keys be null (which is OK) they can be 0 too.

I mapped one of these tables to a Model it returns the desired None value when it is Null in the table but raises an exception when the value is 0.

Is there a way to make it return None on foreign keys containing the value 0.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

俏︾媚 2024-11-09 03:47:56

您必须创建自己的类似 ForeignKey 的字段,该字段不会因 0 而阻塞。请注意,任何非NULL都可能有效,因此您的数据在这里是错误的,您应该考虑修复它。

You'd have to create your own ForeignKey-like field that would not choke on a 0. Note that any non-NULL value could be valid, so your data is in the wrong here, and you should consider repairing it.

屌丝范 2024-11-09 03:47:56

面临同样的问题,所以最终编写 ForeignKey 子类:

class LegacyForeignKey(models.ForeignKey):
    """
    ForeignKey for legacy databases where foreign keys columns
    are non-nullable and using zero values as NULL.

    class Order(models.Model):
        carrier = LegacyForeignKey('Carrier', null=True)
        class Meta:
           managed = False
           db_table = "ps_order"

    order.carrier_id = 0
    order.carrier  # no Carrier.DoesNotExist exception
    """

    def get_local_related_value(self, instance):
        ret = super().get_local_related_value(instance)
        return [None if item == 0 else item for item in ret]

Faced the same problem, so end up with writing ForeignKey subclass:

class LegacyForeignKey(models.ForeignKey):
    """
    ForeignKey for legacy databases where foreign keys columns
    are non-nullable and using zero values as NULL.

    class Order(models.Model):
        carrier = LegacyForeignKey('Carrier', null=True)
        class Meta:
           managed = False
           db_table = "ps_order"

    order.carrier_id = 0
    order.carrier  # no Carrier.DoesNotExist exception
    """

    def get_local_related_value(self, instance):
        ret = super().get_local_related_value(instance)
        return [None if item == 0 else item for item in ret]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文