gpt4 book ai didi

django - 将非默认管理器与 GenericForeignKey() 结合使用

转载 作者:行者123 更新时间:2023-12-03 06:28:24 28 4
gpt4 key购买 nike

我更改了 GenericForeignKey() 可以引用的某些对象的默认管理器,以便这些对象可能不再出现在该默认管理器中。

我有其他管理器能够找到这些已删除对象,但我看不出有什么办法可以告诉内容类型框架它们。这可能吗?

我正在对某些模型实现“软删除”,其中涉及以下管理人员:

from django.db import models

SDManager(models.Manager):

def get_query_set(self):
return super(SDManager, self).get_query_set().filter(is_deleted=False)

SDDeletedManager(models.Manager):

def get_query_set(self):
return super(SDDeletedManager, self).get_query_set().filter(is_deleted=True)

这允许我执行以下操作:

SDModel(models.Model):
# ...
objects = SDManager() # Only non (soft) deleted objects
all_objects = models.Manager() # The default manager
deleted_objects = SDDeletedManager() # Only (soft) deleted objects

当在模型中使用 GenericForeignKey() 字段来引用定义的对象(例如 SDModel)时,它使用 _default_manager 属性来评估到objects 管理器,以获取引用。这意味着当对象被软删除时它会丢失引用。

这是我使用 GenericForeignKey() 字段的主要原因之一。我一直在研究的一个解决方案是实现内容类型框架的较小版本,以便我可以定义自己的 get_object() ,它使用 all_objects 管理器来访问引用对象。

所以我的问题确实是:

Is it possible to use a non-default manager with the existing content types framework so that it finds the soft deleted objects, or will I have to re implement all the parts I need from scratch?

最佳答案

我遇到了与您完全相同的问题,在深入研究文档/源代码后,Django 似乎没有提供开箱即用的方法来执行此操作。我发现的最简单的方法是子类化 GenericForeignKey ,然后重写 __get__ 方法。

The troublesome line是它调用的地方:

rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field))

所以这一行需要重写为:

rel_obj = ct.model_class().all_objects.get(pk=getattr(instance, self.fk_field))

这有点骇人听闻,但它确实有效,然后您就可以像平常一样使用 GenericForeignKey 的全部功能。

关于django - 将非默认管理器与 GenericForeignKey() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375668/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com