问题描述
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。