首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-contenttypes -列出模型的所有通用关系

django-contenttypes -列出模型的所有通用关系
EN

Stack Overflow用户
提问于 2012-05-22 21:32:25
回答 2查看 918关注 0票数 4

我想对一个模型进行反思,并列出它的所有向后通用关系。

我的模型是这样的:

代码语言:javascript
复制
class Service(models.Model):
    host = models.ForeignKey(Host)

    statuses = generic.GenericRelation(Status)

状态对象如下所示:

代码语言:javascript
复制
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()显示了,只是它还显示了其他不需要的东西。

我认为这可能是一个可行的解决方案,但它对我来说似乎真的很混乱。我很想听一个更好的。

代码语言:javascript
复制
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)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-22 21:47:02

GenericRelation的工作方式与ManyToManyField类似。你可以在Service._meta.many_to_many中找到它

代码语言:javascript
复制
filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many)
票数 3
EN

Stack Overflow用户

发布于 2021-11-11 22:38:27

更新2021:

要列出所有GenericRelations()字段:

代码语言:javascript
复制
print(Service._meta.private_fields)

输出:

代码语言:javascript
复制
[<django.contrib.contenttypes.fields.GenericRelation: statuses>]

但是,如果您有更多具有GenericRelations()关系的字段,它们将显示在输出列表中。

查看文档:

https://docs.djangoproject.com/en/3.2/releases/1.10/#id3

或者,您可以返回所有具有GenericRelation()字段类型的字段。

例如:

代码语言:javascript
复制
# 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

输出:

代码语言:javascript
复制
['my_model_field']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10703109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档