[英]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.