Django将选项限制为与Inlin相关的多个

2024-05-14 08:02:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用limit_choices_to来减少模型的Django管理员在使用内联时使用ManyToMany Field的选择集。在

有趣的是,我想要限制选择的原因是为了性能,因为我想在相关模型类的__str__方法中使用父模型的属性,而不限制选择会导致大量SQL查询。在

以下工作

class ParentOfA(models.Model):
    name = models.CharField(max_length=50, null=True)


class A(models.Model):
    parent = models.ForeignKey(ParentOfA)

    def __str__(self):
        return "%s" % self.parent


class B(models.Model):
    a = models.ManyToManyField(A, limit_choices_to={"a__name":'parent name'})

如果我不在管理表单中为B使用内联(遵循示例in the docs)。在

例如

^{pr2}$

但是,对于内联,limit_choices_to没有任何效果:

class BInline(admin.TabularInline):
    model = B.A.through

@admin.register(B)
class BAdmin(admin.ModelAdmin):
    inline = (BInline,)

有什么建议吗?在


Tags: todjangoname模型selfmodeladminmodels
1条回答
网友
1楼 · 发布于 2024-05-14 08:02:27

我不知道为什么限制选项不适用于内联字段,我也有同样的问题。虽然这不是必需的,但是您可以使用以下答案限制内联字段的queryset:https://stackoverflow.com/a/4236159/1302095

这是一个老问题的老答案,所以我不确定在django的新版本中是否有更好的方法。我使用的是1.8.3版本,这对我很重要!在

此处粘贴代码以供参考:

class RoomInline(admin.TabularInline):
    model = Room

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        field = super(RoomInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

        if db_field.name == 'inside_room':
            if request._obj_ is not None:
                field.queryset = field.queryset.filter(building__exact = request._obj_)  
            else:
                field.queryset = field.queryset.none()

        return field

class BuildingAdmin(admin.ModelAdmin):
    inlines = (RoomInline,)

    def get_form(self, request, obj=None, **kwargs):
        # just save obj reference for future processing in Inline
        request._obj_ = obj
        return super(BuildingAdmin, self).get_form(request, obj, **kwargs)

相关问题 更多 >

    热门问题