过滤中间模型并使用它来修改模型的查询集

时间:2018-12-05 08:44:52

标签: python django django-queryset admin

我想我的问题可以用一个例子来最好地解释。

class A:  # the model where I am making a ModelAdmin
    # 1-to-1 relationship with class B

class B:
    # some fields

class C:
    # many to many with class B
    # field - foreignKey from class D

class D:
    # 1 to 1 relationship with class User

class User:

在我的A类的modelAdmin中,我定义了get_queryset:

def get_queryset(self, request):
    qs = super().get_queryset(request)
    if request.user.is_superuser:
        return qs
    ??return qs.filter(class_C_field=request.user.class_D.pk)

其中?意味着我想做的是从B和C生成的中间表中获取所有记录,并仅获取其类C中的字段等于类D中的实例之一的那些记录。 之后,我想使用C类和B类的字段在模型A的list_display中显示

1 个答案:

答案 0 :(得分:0)

    def get_queryset(self, request):
    qs = super().get_queryset(request)
    if request.user.is_superuser:
        return qs
    qs = A.objects.filter(Afield__C__Cfield=request.user.D.pk)
    return qs

结果是我可以从A类进行查询。因此,如果用户不是管理员,则qs在D的外键下从A返回属于C的所有记录的列表。由于B不再需要A与B一对一。