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

Django admin - property options based on a related parent model

我有一个 parent 和一个 child class。他们之间的关系是many-to-one这样的:

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

他们都与用户 class 有 many-to-many 关系,名为 read_users(它是 object 级别的自定义安全)。

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

例如,在管理员中,我想使用来自 Parent read_users 的用户作为为 Child 实体选择 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, request, **kwargs)

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