Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果Django ORM要处理错误的PK值,是否需要自定义ForeignKey子类?_Python_Django_Orm_Django Models_Primary Key - Fatal编程技术网

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

Python 如果Django ORM要处理错误的PK值,是否需要自定义ForeignKey子类?,python,django,orm,django-models,primary-key,Python,Django,Orm,Django Models,Primary Key,我正在工作的项目在数据库中有脏数据。基本上,最初的设计器创建了外键字段,但没有使用引用完整性强制执行它们。现在有一些FK值是无效的,实际上并不指向存在的记录。通常,我只会删除这些无效的FK值,但位于该db上的应用程序会另外使用存储在这些FK字段中的文字数字0来指示其他信息。实际上没有主键为0的记录 我已经在Django的ORM类和ForeignKey字段中包装了这个有缺陷的表设计,但是它在ForeignKey字段的另一端找不到记录时抛出了很多DoesNotExist异常,这并不意外。我一直在试图

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

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

我正试图通过覆盖get()方法并使用use\u for\u related\u 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

我需要一种方法来捕获并接受可能自定义ForeignKey上的DoesNotExist错误,我正在寻找一个如何处理此错误的示例。或者有人可以推荐一种更好的方法

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

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

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

为什么不花时间修复数据库呢?如果所有不需要的fk都是0,您不能用null替换这些0,并且在模型中有null=True吗?