Django REST框架:级联激活/停用

yrdbyhpb  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(112)

我正在使用django和djangorest框架开发一个API,我想做的是为相关模型级联两个动作
1.删除一个示例,在models. ForeignKey上使用on_delete=modles.CASCADE就可以顺利完成。
1.激活和去激活问题就在这里
我在我的应用程序中定义的每个模型都有一个布尔字段is_active,它指示该示例是否处于活动状态,我在这里要做的是每当is_active字段更改时级联激活和停用,我希望以动态方式处理这一点,因为我的应用程序越来越大,我不想每次为任何模型创建新的外键时都手动更改此服务。
例如,我有以下模型

class Company(AbstractNamingModel):
   
    name_en = models.CharField(_("English Name"), max_length=64, unique=True, null=True,    blank=True)
    name_ar = models.CharField(_("Arabic Name"), max_length=64, unique=True, null=True, blank=True)
    is_active = models.BooleanField(
        _("Is Active"),
        blank=True,
        default=True,
    )

class Branch(AbstractNamingModel):
    
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        verbose_name=("Company branches"),
        related_name="company_branches",
    )
    is_active = models.BooleanField(_("Is Active"), blank=True, default=True)

class Department(AbstractNamingModel):

    branch = models.ForeignKey(
        Branch,
        on_delete=models.CASCADE,
        verbose_name="Branch Departments",
        related_name="branch_departments",
    )
    is_active = models.BooleanField(
        _("Is Active"),
        blank=True,
        default=True,
    )
class Employee(AbstractUser, TimeStampedModel):
    id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    name_en = models.CharField(_("English Name"), max_length=100)
    name_ar = models.CharField(_("Arabic Name"), max_length=100)
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name="employees",
    )

    branch = models.ForeignKey(
        Branch,
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name="employees",
    )
    department = models.ForeignKey(
        Department,
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name="employees",
    )

我想做的是,当我激活/停用一个公司时,我会级联操作来激活/停用所有分支、部门、员工以及公司、分支、部门或员工与该公司相关的任何其他模型示例,同样的事情也会发生在我的系统中的分支、部门、员工和所有模型上。
如何动态地处理这个问题,就像_delete models.CASCADE一样?
我尝试使用apps.get_models()方法,但这给了我应用程序中的所有模型,我被困在这里。

xzabzqsa

xzabzqsa1#

如果你想换一种方式来思考你的问题,你所有的模型 * 共享 * 一个数据is_active=True or False
这个共享的数据片段应该在它自己的表中,每个记录都有一个FK(为了简单起见)。然后,当设置为不活动时,每个模型可以引用它,例如

class Status(Model): # naming is hard
    is_active = models.BooleanField(default=True)
company.status.is_active = False
company.status.is_active.save()

assert branch.status.is_active == False

类似这样的东西将允许您在每个公司的一个源中维护is_active(以及您希望在所有实体之间共享的任何其他内容

相关问题