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を持っていますか?
によって行われます、直接ta.object_id設定する必要はありません。あなたのコードは、 'AttributeError: 'int'オブジェクトには '_state'属性がありません。私は最後の 'id'を削除しました。エラーは' AttributeError: 'Company'オブジェクトに属性 'model'がありません – Wilerson
最終的に、私は 'id'を除いて、あなたの解が正しいと分かりました。 'TagAttribution'の' __unicode__'メソッドを打ち切りました。 – Wilerson