【问题标题】:Controlling queryset after filtering | Django Admin过滤后控制查询集 | Django 管理员
【发布时间】:2016-01-13 20:05:51
【问题描述】:

我正在尝试自定义 Django 界面。 我有一个 CategoryAdmin(admin.ModelAdmin),它有一个外键,每个 Category 都可以有来自同一个表的 SubCategories。

每个具有子类别的类别都将显示为内联。 基本上在主要类别查询集上,我想显示那些 Parent = 0 所以我将 get_queryet 覆盖到这个:

def get_queryset(self, request):
    if request.user.is_superuser:
        qs = super(CategoryAdmin, self).get_queryset(request)
        return qs

    company = CompanyUsers.objects.filter(UserId = request.user.id) #not relevant
    companyid = company.values_list('CompanyId', flat=True) #not relevant
    qs = Category.objects.filter(CompanyId = companyid, Parent = 0) 
    return qs

现在,当用户选择其中一个类别时,内联不会被父级 = 0 过滤,但是当单击 更改 它们时,我收到了错误:

“主键为'x'的类别对象不存在”

关于如何仅在主要类别查询集上进行过滤的任何想法?

注意:删除“Parent = 0”时错误消失。

注意 2:知道单击了哪个实例可能很有用。我知道可以通过覆盖 get_formset 但不幸的是 get_queryset 在 get_formset 之前被调用:(

非常感谢。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    由于 parent 指的是 Category 对象,为什么要使用 0 而不是 None 呢? Parent 必须是对象而不是整数。

    1. 重命名您的属性。 CompanyId, Parent 必须成为 companyId, parent
    2. 在您的类别类中声明父级为:

      parent = models.ForeignKey(User, null=True, blank=True, default = None)

    只有子类别才会有父关系,如果类别是父类别,则父类别将为无。然后,当您想要获取父类别时,您将过滤您的查询,例如:

    Category.objects.filter(companyId = companyid, parent = None)
    

    另外,parent 将是 Category 对象而不是整数。

    【讨论】:

    • Parent 指的是表中的 PK,因此不能为 none。另外,我看不出这是如何解决我的问题的。
    • 为什么外键不能为空?
    • 您可以查看更新后的答案以获取更多信息。
    • 因为我不希望在没有父级的情况下添加类别。我试过你的解决方案,结果是一样的。我相信这可以通过一个条件来解决。还是谢谢
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2019-07-14
    • 2019-07-13
    • 2017-12-26
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多