我想对一个模型进行反思,并列出它的所有向后通用关系。
我的模型是这样的:
class Service(models.Model):
host = models.ForeignKey(Host)
statuses = generic.GenericRelation(Status)状态对象如下所示:
class Status(TrackedModel):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
class Meta:
verbose_name_plural = 'statuses'我想通过编程了解到statuses是服务模型的通用关系。这是可能的吗?Status._meta.fields没有显示statuses,但Status._meta.get_all_field_names()显示了,只是它还显示了其他不需要的东西。
我认为这可能是一个可行的解决方案,但它对我来说似乎真的很混乱。我很想听一个更好的。
from django.db.models.fields import FieldDoesNotExist
from django.contrib.contenttypes import generic
generic_relations = []
for field_name in Service._meta.get_all_field_names():
try:
field = Service._meta.get_field(field_name)
except FieldDoesNotExist:
continue
if isinstance(field, generic.GenericRelation):
generic_relations.append(field)谢谢!
发布于 2012-05-22 21:47:02
GenericRelation的工作方式与ManyToManyField类似。你可以在Service._meta.many_to_many中找到它
filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many)发布于 2021-11-11 22:38:27
更新2021:
要列出所有GenericRelations()字段:
print(Service._meta.private_fields)输出:
[<django.contrib.contenttypes.fields.GenericRelation: statuses>]但是,如果您有更多具有GenericRelations()关系的字段,它们将显示在输出列表中。
查看文档:
https://docs.djangoproject.com/en/3.2/releases/1.10/#id3
或者,您可以返回所有具有GenericRelation()字段类型的字段。
例如:
# models.py
class MyModel(models.Model):
. . .
my_model_field = GenericRelation(OtherPolyModel)
def get_generic_relation_fields(self):
"""
This function returns all the GenericRelation
fields needed to return the values that are
related to a polymorphic model.
"""
fields = [f.attname for f in self.Meta.model._meta.get_fields()]
file_fields = []
for field in fields:
get_type = self.Meta.model._meta.get_field(field)
field_type = get_type.__class__.__name__
if field_type == "GenericRelation":
file_fields.append(field)
return file_fields输出:
['my_model_field']https://stackoverflow.com/questions/10703109
复制相似问题