[英]Django Tastypie Generic Relation
我在Django項目中有一些類似的模型:
class Link(BaseModel, BeginEndModel):
entity0_content_type = models.ForeignKey(ContentType, related_name='link_from')
entity0_object_id = models.PositiveIntegerField()
entity0_content_object = generic.GenericForeignKey('entity0_content_type', 'entity0_object_id')
entity1_content_type = models.ForeignKey(ContentType, related_name='link_to')
entity1_object_id = models.PositiveIntegerField()
entity1_content_object = generic.GenericForeignKey('entity1_content_type', 'entity1_object_id')
link_type = models.ForeignKey(LinkType)
class Work(BaseModel, SluggedModel):
""" Eser """
name = models.CharField(max_length=255)
links = generic.GenericRelation('Link', content_type_field='entity0_content_type', object_id_field='entity0_object_id')
我想像這樣用Tasypie Api創建一個WorkResource:
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
from tastypie import fields, utils
from tastypie.contrib.contenttypes.fields import GenericForeignKeyField
from tastypie.authentication import Authentication, SessionAuthentication
from tastypie.authorization import DjangoAuthorization, Authorization
from models import Link, LinkType, LinkPhrase
from models import Work
....
class WorkResource( BaseModelResource ):
links = fields.ToManyField('musiclibrary.api.LinkResource', 'links_set')
class Meta:
queryset = Work.objects.all()
always_return_data = True
filtering = {
'slug': ALL,
'name': ['contains', 'exact']
}
class LinkResource( ModelResource ):
entity0_content_object = GenericForeignKeyField({
Work: WorkResource,
Artist: ArtistResource
}, 'entity0_content_object')
entity1_content_object = GenericForeignKeyField({
Work: WorkResource,
Artist: ArtistResource
}, 'entity1_content_object')
link_type = fields.ForeignKey(LinkTypeResource, 'link_type', full=True, null=True)
class Meta:
queryset = Link.objects.all()
當我想查看工作資源的結果時, links
屬性始終是一個空數組。 為什么我不能在2種資源之間建立關系?
注意:我使用Django 1.6.5,django-tastypie 0.11.1。 我在上面簡化了我的models.py和api.py示例。 如果需要,我可以分享我的完整代碼。
這有點棘手,因為與ContentTypes有兩種聯系。 我想這會有所幫助:
class WorkResource( BaseModelResource ):
links = fields.ToManyField('musiclibrary.api.LinkResource', attribute=lambda bundle: Link.objects.filter(entity0_content_type=ContentType.objects.get_for_model(bundle.obj), entity0_object_id=bundle.obj.id))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.