遍历抽象Django mod的所有与外键相关的子级

2024-04-29 16:38:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试迭代给定django模型的所有外键相关模型。可能有13个不同的模型可能具有外键关系,但它们都继承相同的抽象基类。我想在一个循环中遍历所有这些元素,以修改属于父类的字段。我的代码看起来像。在

class ClusteringRecord(models.Model):
    """
    An abstract class to hold data that is repeated from model to model
    """

    wip = models.ForeignKey(
        ClusteringWIP, null=True, on_delete = models.SET_NULL)
    cluster_comment = models.CharField(max_length=1000, null=True, blank=True)

    class Meta:
        abstract = True


class ClusteringNPIRecord(ClusteringRecord):
    """Django Model object representing an NPI record that was not able to be
    clustered by automatic clustering logic in the database.
    """

    npi_id = models.CharField(max_length=1000, null=True)
    npi_number = models.CharField(max_length=1000, null=True)


class ClusteringDEARecord(ClusteringRecord):
    """Django Model object representing a DEA record that was not able to be
    clustered by automatic clustering logic in the database.
    """

    dea_id = models.CharField(max_length=1000, null=True)
    dea_number = models.CharField(max_length=1000, null=True)

我要使用的代码如下所示:

^{pr2}$

但是它告诉我clusteringrecord_set无效。有没有一种方法可以遍历这个类与提供者相关的所有子类?否则,我将使用13个不同的for循环来实现这一点,并且公然违反DRY方法。在

碰巧,这个基类适用于所有13个可能使用ClusteringWIP作为外键的模型,所以简单地迭代所有相关的(不考虑类)将完成相同的事情,所以如果这是最好的方法,请务必告诉我。但不管将来的用途如何,我还是很想知道上述问题的答案。在

还有,在我寻找这个答案的旅途中,我偶然发现了一个django pre_delete信号,它似乎更符合我在这里所要做的事情(即在删除ClusteringWIP时取消任何相关模型的“cluster_comment”字段),如果有人能给我一个例子,说明如何使用它来完成我的任务,我会是非常感谢。在

谢谢。在


Tags: to方法模型truemodelthatmodelsnull
1条回答
网友
1楼 · 发布于 2024-04-29 16:38:43

您可以使用ClusteringRecord的子类()方法。例如:

@classmethod
def related_set(cls, wip):
  classes = cls.__subclasses__()
  return sum([c.objects.filter(wip=wip).all() for c in classes], [])

然后用这个迭代你的对象。在

对于预删除信号,您需要有一个信号.py应用程序中的文件,可能如下所示:

^{pr2}$

使用ClusteringWIP::on_pre_delete方法,如下所示:

def on_pre_delete(self):
  for record in ClusteringRecord.related_set(self):
    record.cluster_comment = None
    record.save()

相关问题 更多 >