簡體   English   中英

在不知道Django中模型名稱的情況下獲取所有相關對象

[英]Get all related objects without knowing model name in Django

我有抽象模型:

class CModel(CParent):

    class Meta:
        abstract = True

並基於此抽象模型有兩個模型:

class Model1(CModel):
    pass

class Model1_A(models.Model):
    model = models.ForeignKey(Model1, related_name="a")

class Model1_A_B(models.Model):
    model = models.ForeignKey(Model1_A, related_name="b")

第二:

class Model2(CModel):
    def all_obj(self):
        ...
        list = Model2_A_B.objects.filter(model__model__pk=self.pk).all()
        ...

class Model2_A(models.Model):
    model = models.ForeignKey(Model2, related_name="a")

class Model2_A_B(models.Model):
    model = models.ForeignKey(Model2_A, related_name="b")

現在我想將函數all_obj()移到abstact類,因此它也將在Model1中可用,但是對於Model1,我需要這樣的東西:

list = Model1_A_B.objects.filter(model__model__pk=self.pk).all()

如何使all_obj()適用於任何模型名稱?

我想到了這樣的東西:

list = eval(self.a.all()[:1][0].b.all()[:1][0].__class__.__name__).objects.filter(model__model__pk=self.pk)

但是我不認為這是正確的方法。 並且有一個問題,只有在self.a.all()[:1] [0]具有相關對象的情況下才起作用,但這並不總是正確的。

正如我從這段代碼中看到的那樣,您的所有模型都是相同的,但命名不同。

為什么不為Modeling創建基類並為每個模型創建實例?

關於all_obj(self)僅使其通用(global)

class CModel(models.Model):
    _related_model = None

   def all_obj(self):
       if self._related_model is None:
           # you could also return None or an EmptyQueryset or whatever
           raise NotImplementedError("CModel subclasses must define '_related_model'")

       # you don't need the `.all()` after a `.filter()`
       return self._related_model.objects.filter(model__model__pk=self.pk)

   # your code here

class Model1(CModel):
    # note that you'll have to define Model_1_A_B before 
    _related_model = Model_1_A_B

    # etc

class Model2(CModel):
    # note that you'll have to define Model_2_A_B before 
    _related_model = Model_2_A_B

    # etc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM