ForeignKey字段上的Django零值

时间:2011-04-18 04:22:35

标签: django legacy-database

我正在设计设计非常糟糕的旧数据库。在某些表中,外键不仅可以为空(可以),它们也可以为0。

我将其中一个表映射到Model,当它在表中为Null时返回所需的None值,但在值为0时引发异常。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

面对同样的问题,最后编写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]