2012-05-22 2 views
3

모델에 대해 반성하고 모든 일반적인 일반 관계를 나열하고자합니다.django-contenttypes - 모델에 대한 모든 일반 관계 나열

내 모델은 다음과 같습니다

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.fieldsstatuses을 표시하지 않지만 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) 

고마워요!

답변

3

GenericRelationManyToManyField과 유사하게 작동합니다. Service._meta.many_to_many에서 찾을 수 있습니다.

filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many) 
+0

그냥 감사합니다. –

+0

이것은 1.5에서는 작동했지만 1.6에서는 더 이상 작동하지 않습니다. 우리는 필드를 get_field_by_name을 사용하여 얻을 수는 있지만 get_field는 사용할 수 없으므로 아마 버그 일 것입니다. –

+1

이것은 슬프게도 구식입니다. 지금은'Service._meta.virtual_fields'에서만 사용할 수있는 것으로 보입니다. – marr75