如果Django ORM要使用错误的PK值,是否需要自定义ForeignKey子类?

2024-06-12 14:44:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在工作的项目在数据库中有脏数据。基本上,最初的设计者创建了外键字段,但没有使用引用完整性来强制它们。现在有一些FK值是无效的,实际上并没有指向现有的记录。通常我只删除这些无效的FK值,但是位于这个db上的应用程序使用存储在这些FK字段中的文本数字0来指示其他信息。实际上没有主键为0的记录。在

我已经在Django的ORM类和ForeignKey字段中包装了这个有缺陷的表设计,但是它在ForeignKey字段的另一端找不到记录时抛出了很多doesnotex异常。我一直在试图找到一种方法,就在这个项目中,悄悄地捕捉这个异常,而不是在代码中到处乱扔try/except块来抛出这个异常。在本例中,我只想防止Django ORM抛出错误。在

我试图用一个自定义管理器来实现这个目标,方法是重写get()方法并使用use_for_related_field=True class属性。虽然在ForeignKey的键值无效的情况下,显然没有使用自定义管理器的get()方法。在

class FWManager(models.Manager):
    """
    FW's data is "dirty".  Primarily it isn't enforcing referential integrity on 
    many of it's foreign key fields leading to oprphaned records.  Django throws a
    DoesNotExist exception in this case which is troublesome  having to catch it for
    any fk field access.

    Custom FWManager will silently "eat" the DoesNotExist error and return None
    instead.
    """

    use_for_related_fields=True

    def get(self, *args, **kwargs):

        #init
        retval = None

        try:
            retval = super(FWManager, self).get(*args, **kwargs)
        except:
            # silently eat errors
            pass

        return retval

我需要一种方法来捕捉并吃掉潜在的自定义外键上的doesnotex错误,我正在寻找一个如何处理的例子。或者有人可以推荐一个更好的方法。在


Tags: 项目django方法forget记录ormit
1条回答
网友
1楼 · 发布于 2024-06-12 14:44:38

我认为应该有更好的可能性来解决这个问题,因为您的解决方案仍然没有给您的数据库带来任何完整性。可能是:

  • 更改模型:将FK的参数设置为null=True,并将0更改为None
  • 将所有带有“0”的FK设置为另一个值,并创建一个相关的“虚拟对象”,表示“已删除”对象

在(所有)异常上默默失败也会给您带来很多麻烦,因为您可能会在不知道的情况下遇到其他问题。。。。在

相关问题 更多 >