Django admin - 基于相关父模型的属性选项

问题描述

我有一个父类一个子类。它们之间的关系是这样的多对一:

class Parent(AccessmanagerMixin,models.Model):
    name = models.CharField(max_length=150)
    def __str__(self) -> str:
        return self.name

class Child(AccessmanagerMixin,models.Model):
    name = models.CharField(max_length=150)
    parent_group = models.ForeignKey(Parent,on_delete=models.CASCADE,null=True )
    def __str__(self) -> str:
        return self.name

它们都与名为 read_users 的 User 类具有多对多关系(它是对象级别的自定义安全性)。

class AccessmanagerMixin(models.Model):
    read_users = models.ManyToManyField(User,related_name='read_users')
    class Meta:
        abstract = True

例如在管理员中,我想使用来自父 read_users 的用户作为为子实体选择 read_users 的选项?我怎样才能以最好的方式做到这一点?我可以吗 覆盖 Child admin.ModelAdmin 中的 read_users 属性

解决方法

您可以使用 formfield_for_manytomany() 方法为管理站点上的多对多字段定义显示哪些值。

显示子对象的父级 read_users 联合的示例:

class ChildAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self,db_field,request,**kwargs):
        if db_field.name == "read_users":
            kwargs["queryset"] = User.objects.filter(pk__in=(list(Parent.objects.values_list("read_users__pk",flat=True))))
        return super().formfield_for_manytomany(db_field,**kwargs)

有关详细信息,请参阅官方 Django documentation