2011-04-18 120 views
1

我正在设计非常糟糕的遗留数据库。在某些表上,不仅外键可以为空(这是可以的),它们也可以是0。Django在外键字段上的零值

我映射这些表返回所需的无值时,它是表空模型之一,但如果值是0

抛出一个异常有没有办法让它在返回None包含值为0的外键。

+0

您可以添加是给你头痛的查询和模式? – fceruti 2011-04-18 04:46:28

+0

这真的是一个普遍的问题,看起来可能没有答案。 – Siavash 2011-04-18 09:42:48

回答

0

您必须创建自己的类似ForeignKey的字段,该字段不会在0上窒息。请注意,任何非NULL可能是有效的,所以你的数据在这里是错误的,你应该考虑修复它。

+0

无法修复它是一个非常旧的数据库 – Siavash 2011-04-18 04:37:46

+0

是否在FK表中添加一行PK为0的选项? – Peter 2012-04-25 12:18:41

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]