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)
怎么做对了?
谢谢!
维塔利
目前在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)
希望这可以帮助.
"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代码的应用程序.
我希望这能解决问题.我只是让自己工作......
| 归档时间: |
|
| 查看次数: |
2033 次 |
| 最近记录: |