2015-10-14 85 views
0

我有以下设置,我想用于标记泛型对象(此刻只是一种类型,一种资源对象)。Django:使用泛型关系作为直通模型时返回对象

class Resource(models.Model): 
    ... 
    tag_items = GenericRelation(TaggedItem, related_query_name='resources') 

    @property 
    def platform(self): 
     return self.tag_items.filter(relationship=TaggedItem.PLATFORM) 

    @property 
    def characteristics(self): 
     return self.tag_items.filter(relationship=TaggedItem.CHARACTERISTICS) 


class Tag(models.Model): 
    ... 


class TaggedItem(models.Model): 
    # Relationship choices 
    PLATFORM = 'platform' 
    CHARACTERISTICS = 'characteristics' 
    RELATIONSHIP_CHOICES = (
     (PLATFORM, 'Platform'), 
     (CHARACTERISTICS, 'Characteristics')) 

    tag = models.ForeignKey(Tag, related_name="%(class)s_items") 
    content_type = models.ForeignKey(ContentType, related_name="%(class)s_tagged_items") 
    object_id = models.PositiveIntegerField(db_index=True) 
    object = GenericForeignKey('content_type', 'object_id') 
    relationship = models.CharField(choices=RELATIONSHIP_CHOICES, default=CHARACTERISTICS, max_length=50) 

我想要的是resource.platform/characteristics通过模型 TaggedItem对象返回标签的对象,而不是的列表。

虽然不能完全弄清楚最好的办法。有什么想法吗?这是一个明智的做法吗?

+1

对象不应该是一个领域,它的Python为数据类型的保留关键字,你应该改变它content_object或别的东西。 –

+0

谢谢! –

回答

1

试试这个:

class Resource(models.Model): 
    #... 
    tag_items = GenericRelation(TaggedItem, related_query_name='resources') 

    @property 
    def platform(self): 
     return Tag.objects.filter(
      taggetitem_items__resources=self, 
      taggetitem_items__relationship=TaggedItem.PLATFORM, 
     ) 

    @property 
    def characteristics(self): 
     return Tag.objects.filter(
      taggetitem_items__resources=self, 
      taggetitem_items__relationship=TaggedItem.CHARACTERISTICS, 
     ) 
0
@property 
def characteristics(self): 
    return Tag.objects.filter(pk__in=self.tag_items.filter(relationship=TaggedItem.CHARACTERISTICS).values('tag')) 

警告:未经测试的代码,可能无法正常工作,但您明白了。