隐藏默认情况下用作外键的查询集的子集....在Django管理中显示完整的查询集

时间:2018-10-02 08:17:32

标签: django django-queryset django-managers

在我的Django模型中,Product属于ProductCategory

class FinancialProduct(models.Model):
    product_category = models.ForeignKey(ProductCategory, null=True)

我希望能够在幕后创建一个新的ProductCategory,以便默认情况下它们不会出现在任何查询中。

这是Django admin和一个非常特定的其他查询的例外。

为此,我为Manager创建了一个ProductCategory

class ProductCategoryManager(models.Manager):
   def get_queryset(self):
      return super().get_queryset().filter(status=ProductCategory.STATUS_PUBLIC)

   def get_complete_queryset(self):
      return super().get_queryset()

然后在admin.py中输入

@admin.register(FinancialProduct)
class ProductAdmin(admin.ModelAdmin):
    model = Product

    def get_queryset(self, request):
        return Product.objects.get_complete_queryset()

通常这很好用,但是当我在Django admin上进入Product并尝试添加隐藏的ProductCategory时,找不到它:

product category instance with id 3 does not exist.

我是否应该继续尝试覆盖Django管理员使用的查询集,还是有更聪明的方法?理想情况下,我希望避免在所有地方都使用过滤器,因为这是人们忘记的那种事情。


注意:我实际上已经发现了文档do not recommend this approach

0 个答案:

没有答案