过滤后控制查询集| Django Admin

时间:2015-10-15 11:26:17

标签: django django-models django-admin

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

每个具有子类别的类别都将显示为内联。 基本上在主要的类别查询集上,我想显示那些父亲= 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

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

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

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

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

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

当父类引用类别对象时,为什么要使用0而不是None?父必须是一个不是整数的对象。

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

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

  3. 只有子类别具有父关系,如果类别是父级,则父级将为无。然后,当您想获得父类别时,您将过滤您的查询,如:

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

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