2012-03-01 15 views
2

私はアプリケーションのタグ付けシステムを実装しようとしています。ここでは、各コンテンツタイプに対して特定のタグのみが許可されています。Django間接的な一般的な関係

Tagモデルでコンテンツタイプを設定し、TagAttributionモデルでこの値を使用してみましたが、興味深い結果が得られました。

コード:

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 
from django.contrib.auth.models import User 

class Tag(models.Model): 
    value = models.CharField(max_length=32) 
    created_by = models.ForeignKey(User) 
    appliable_to = models.ForeignKey(ContentType) 

    def __unicode__(self): 
     return self.value 

class TagAttribution(models.Model): 
    tag = models.ForeignKey(Tag) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('tag__appliable_to', 'object_id') 

    def __unicode__(self): 
     return "%s for id %s of class %s" % (self.tag.value, self.object_id, self.content_object.model) 

シェルテスト:

ct = ContentType.objects.get(model='company') 
tag = Tag() 
tag.value = 'value' 
tag.created_by = User.objects.get(id=1) 
tag.appliable_to = ct 
tag.save() 
ta = TagAttribution() 
ta.tag = tag 
ta.object_id = Company.objects.get(id=1).id 
ta.content_object = ta.tag.appliable_to 
ta.save() 
ta 

出力:

<TagAttribution: value for id 13 of class company> 

私はこの動作を理解していません。なぜ私は会社ID 1を使用していた場合、それはid 13を持っていますか?

答えて

3

エラーはここにある:

ta.content_object = ta.tag.appliable_to 

ここta.content_objectは、当社のオブジェクトが、ContentTypeをではありません。正しいコードは次のようになります。

ta.content_object = Company.objects.get(id=1).id 

また、あなたが動作するようには思えないこと、それは悲しいことGenericForeignKeyフィールド

+0

によって行われます、直接ta.object_id設定する必要はありません。あなたのコードは、 'AttributeError: 'int'オブジェクトには '_state'属性がありません。私は最後の 'id'を削除しました。エラーは' AttributeError: 'Company'オブジェクトに属性 'model'がありません – Wilerson

+0

最終的に、私は 'id'を除いて、あなたの解が正しいと分かりました。 'TagAttribution'の' __unicode__'メソッドを打ち切りました。 – Wilerson

関連する問題