python - Django Admin - 通过模型过滤 ManyToManyField

标签 python django django-admin manytomanyfield

如何在与手动定义的 through 模型具有 ManyToManyField 关系的对象的管理页面内过滤查询集?

给定模型.py

class Foo(models.Model):
    foo_field1 = models.CharField(max_length=50)

class Main(models.Model):
    main_field1 = models.CharField(max_length=50)
    m2mfield = models.ManyToManyField(Foo, through="FooBar")

class FooBar(models.Model):
    main = models.ForeignKey(Main, on_delete=models.CASCADE)
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
    new_field = models.CharField(max_length=50)

admin.py 内部

class M2MInlineAdmin(admin.TabularInline):
    model = Main.m2mfield.through
    extra = 1

class MainAdmin(admin.ModelAdmin):
   inlines = [M2MInlineAdmin,]
   ...

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        print('called formfield_for_manytomany')
        return super().formfield_for_manytomany(db_field, request, **kwargs)

    def get_field_queryset(self, db, db_field, request):
        print('called get_field_queryset')
        return super().get_field_queryset(db, db_field, request)

我尝试访问这两个方法,但如果我指定 through 表,则不会调用它们。但是,如果 ManyToMany 关系简单地定义如下:

class Main(models.Model):
    main_field1 = models.CharField(max_length=50)
    m2mfield = models.ManyToManyField(Foo)

是否有一种方法可以在指定直通表时过滤查询集(同时能够访问请求上下文)?

编辑:

当 ManyToManyField 指定了 through 模型时,仅当 modelAdmin 类中没有指定 fieldsets 时,才会调用这些方法。

定义字段集后如何访问这些方法?

最佳答案

formfield_for_manytomany 方法 seems to be called仅当使用默认表单时。定义字段集时,它使用不同的形式,这就是上面的方法没有被调用的原因。

由于您对多对多字段使用表格管理,因此您可以覆盖 get_queryset 以使用字段进行过滤。

class M2MInlineAdmin(admin.TabularInline):
    model = Main.fruits.through
    extra = 1

    def get_queryset(self, request):
        qs = super(M2MInlineAdmin, self).get_queryset(request)
        qs = qs.filter(some_arg=some_value)
        return qs

或者,您可以编写自定义模型表单并在管理中使用它而不是默认表单。

class MainAdminForm(forms.ModelForm):

    class Meta:
        model = Main
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # custom setup


class MainAdmin(admin.ModelAdmin):
    form = MainAdminForm

关于python - Django Admin - 通过模型过滤 ManyToManyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208630/

相关文章:

django - 我可以在不创建自定义用户的情况下在Django 1.5中更改USERNAME_FIELD吗?

django - 如何在没有 openshift 的情况下托管 Django localhost 应用程序?

python - Django Admin 内联 OneToOne 字段

python - 运行 make migrations 时出现 Django 关系错误

python - dyno falls sleep django heroku postgresql 后找不到图像

python - 如何单击不是由我创建的 Java 工具栏中的按钮?

python - 字符串 "NA"与pandas na类型冲突

python - 在 Scrapy 中利用 Beautifulsoup

django-admin - 如何向管理员列表添加自定义按钮?

python - SQLAlchemy 过滤器用于不包含数组列中值的行