Django tastypie和GenericForeignKey

mos*_*krc 9 django rest django-models tastypie

我有GFK的Page模型.

class Page(models.Model):
    title = models.CharField(max_length=200)
    content_type = models.ForeignKey(ContentType,null=True,blank=True)
    object_id = models.CharField(max_length=255,null=True,blank=True)
    content_object = generic.GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)

class TextContent(models.Model):
    content = models.TextField(null=True, blank=True)
    pages = generic.GenericRelation(Page)
Run Code Online (Sandbox Code Playgroud)

我做了Page.objects.get(pk = 1).content_object,我明白了.

请帮我看一下REST中锚定对象的链接(或输出到JSON).

class PageResource(ModelResource):
    content_object = fields.?????

    class Meta:
        queryset = Page.objects.all()
        resource_name = 'page'
Run Code Online (Sandbox Code Playgroud)

怎么做对了?

谢谢!

维塔利

tay*_*fun 7

目前在tastypie中使用泛型关系并不容易.在tastypie github页面上提交了一些补丁但这些补丁在撰写本文时尚未合并.

最简单的方法是,定义contenttype资源并将其用于具有泛型关系的资源.有点像:

class ContentTypeResource(ModelResource):
    class Meta:
        queryset = ContentType.objects.all()
        resource_name = "contrib/contenttype"
        fields = ['model']
        detail_allowed_methods = ['get',]
        list_allowed_methods = ['get']

class PageResource(ModelResource):
    content_object = fields.ToOneField('myresources.ContentTypeResource', 'content_object')


    class Meta:
        queryset = Page.objects.all()
        resource_name = 'page'
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Cap*_*wup 5

"myresources"是包含ContentTypeResource的应用程序.如果它与您的其他资源位于同一个应用程序中,则无需限定它.在下面的代码中删除.

"contrib/contenttype"是资源的名称.设置您自己的名称是可选的.如果您没有指定,Tastypie将为您创建一个.我在下面的更新代码中删除了它.

fields = ['model']部分限制此资源表示的模型中的可访问字段.如果你看一下Django代码中ContentType模型的定义,你会发现它有一个名为'model'的字段.

我认为最初的答案是其字段名称混淆了.您正在尝试为content_type创建新资源,并将其挂钩到模型中的content_type外键.上面的代码对此进行排序.

class ContentTypeResource(ModelResource):
    class Meta:
        queryset = ContentType.objects.all()
        fields = ['model']
        detail_allowed_methods = ['get',]
        list_allowed_methods = ['get']

class PageResource(ModelResource):
    content_type = fields.ToOneField('ContentTypeResource', 'content_type')

    class Meta:
        queryset = Page.objects.all()
        resource_name = 'page'
Run Code Online (Sandbox Code Playgroud)

您还需要在urls.py中注册ContentTypeResource,就像使用其他所有资源一样:

from myapp.api import ContentTypeResource

v1_api = Api(api_name='v1')
v1_api.register(ContentTypeResource())
Run Code Online (Sandbox Code Playgroud)

"myapp"位再次是包含ContentTypeResource的api代码的应用程序.

我希望这能解决问题.我只是让自己工作......