私はいくつかのモデルを持っています:
Tag(models.Model):
name = models.CharField()
Tag2(models.Model):
name = models.CharField()
Blog(models.Model):
name = models.CharField()
tag = models.ManyToMany(Tag)
tag2 = models.ManyToMany(Tag2)
Author(models.Model):
name = models.CharField()
tag = models.ManyToManyField(Tag)
tag2 = models.ManyToManyField(Tag2)
SomeOtherModel1(models.Model):
name = models.CharField()
tag = models.ManyToManyField(Tag)
tag2 = models.ManyToManyField(Tag2)
SomeOtherModel2(models.Model):
someothermodel1 = models.ManyToManyField(SomeOtherModel1)
tag2 = models.ManyToManyField(Tag2)
Post(models.Model):
name = models.CharField()
tag = models.ManyToMany(Tag)
tag2 = models.ManyToMany(Tag2)
author = models.ManyToMany(Author)
blog = models.ForeignKey(Blog)
someothermodel = models.ForeignKeyField(SomeOtherModel2)
要素のすべてのタグと tag2s (ブログ、作成者、およびその他すべての関連オブジェクトから) を収集する必要がありますPost
。将来的には、他のモデルを追加する予定です
作り方は?
私の現在の解決策は次のとおりです。
AbstractModel(models.Model)
class Meta:
abstract = True
def tags(self, add_self=True):
try: result = self.tag.all() if add_self else Tag.objects.none()
except: result = Tag.objects.none()
for fieldname in self._meta.get_all_field_names():
try: result |= reduce(or_, [child.tags() for child in self._meta.get_field(fieldname).value_from_object(self)])
except: pass
return result
def tag2s(self, add_self=True):
try: result = self.tag2.all() if add_self else Tag2.objects.none()
except: result = Tag2.objects.none()
for fieldname in self._meta.get_all_field_names():
try: result |= reduce(or_, [child.tag2s() for child in self._meta.get_field(fieldname).value_from_object(self)])
except: pass
return result
Author(AbstractModel)
...
SomeOtherModel1(AbstractModel)
...
SomeOtherModel2(AbstractModel)
...
Post(AbstractModel)
...
この解決策は醜いと思います。美しくする方法は?追加関数 (tag2s、tag3s など) を使用せずに作成する方法は次のとおりです。
class AbstractModel(models.Model):
def getRelatedObjects(fieldname='tag', add_self=True):