4

モデルを振り返り、その下位ジェネリック関係をすべてリストアップしたいと思います。

私のモデルは次のようになります。

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は表示されませんstatusesStatus._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)

ありがとうございました!

4

2 に答える 2

3

GenericRelation同様に機能しManyToManyFieldます。あなたはそれを見つけることができますService._meta.many_to_many

filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many)
于 2012-05-22T13:47:02.343 に答える
0

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']
于 2021-11-11T22:38:27.353 に答える