我正在研究设计非常糟糕的遗留数据库。在某些表上,外键不仅可以为空(没关系),它们也可以为 0。
我将其中一个表映射到一个模型,当它在表中为 Null 时返回所需的 None 值,但在值为 0 时引发异常。
有没有办法让它在包含值 0 的外键上返回 None。
我正在研究设计非常糟糕的遗留数据库。在某些表上,外键不仅可以为空(没关系),它们也可以为 0。
我将其中一个表映射到一个模型,当它在表中为 Null 时返回所需的 None 值,但在值为 0 时引发异常。
有没有办法让它在包含值 0 的外键上返回 None。
您必须创建自己ForeignKey
的类似字段,不会在0
. 请注意,任何非NULL
值都可能是有效的,因此您的数据在这里是错误的,您应该考虑修复它。
面临同样的问题,所以最终写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]