是否有可能包括对相关车型领域,使用tastypie?
按我下面的模型:如果我坚持一个VideoContent和一个实例的TextContent到数据库,然后我就可以从我的内容资源2点的对象,但是,没有附加字段都可用。
是否有可能包括相关车型,迎合不断添加更多的内容类型,而不必重写内容资源,还是我在这个即将从地里(在这种情况下,视频的URL和文本内容),并会方向错误?
我们的目标是能够在不必修改的内容资源更CONTENTTYPES扩展(假设有可能把它摆在首位的工作)
Models.py:
class Content(models.Model):
parent = models.ForeignKey('Content', related_name='children', null=True, blank=True)
class TextContent(Content):
text = models.CharField(max_length=100)
class VideoContent(Content):
url = models.CharField(max_length=1000)
然后我的资源:
class ContentResource(ModelResource):
children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True)
class Meta:
resource_name = 'content'
queryset = ContentResource.objects.all()
authorization = Authorization()
always_return_data = True
我发现了另一个答案一个很好的解决方案
填充一个tastypie资源的多表继承的Django模型
我碰到了同样的问题 - 尽管我仍然在解决它的中间。 我到目前为止已经想通了两件事情:
Django的模型utils的提供了一个传承的经理,让您使用的抽象基类来查询它的表,可以自动向下转换查询结果。
有一点要看看是脱水/水化可用资源类的方法。
这是我做的:
class CommandResource(ModelResource):
class Meta:
queryset = Command.objects.select_subclasses().all()
这只是让你一半-资源还必须包括脱水/水化的东西,因为你必须手工打包对象了来自用户的传输(或recieving)。
现在我意识到的事情是,这是超级哈克而且也得是由tastypie提供了更好/更清洁的方式 - 他们不能指望你必须这样做型手动重新包装在这些类型的情况 - 但是,也许他们是这样。 我只有约8小时与tastypie经验@这一点,所以如果我解释这一切错误也许一些不错的计算器,用户可以设置我直。 :d:d:d
我有同样的要求,终于解决了这个问题。
我不喜欢在上面给出的链接,因为我不喜欢组合查询集和重新排序的想法的答案。
显然,你可以继承多个资源。
通过继承多个资源,包括资源的领域。
而且,由于这些领域各自独有的资源,我让他们在init空。
不知道是否有一种方法来列出父母只有一次。 (现在有两种,一为子类,和一个在元)
class SudaThreadResource(ThreadResource):
def __init__(self, *args, **kwargs):
super(SudaThreadResource, self).__init__(*args, **kwargs)
for field_name, field_object in self.fields.items():
# inherited_fields can be null
if field_name in self.Meta.inherited_fields:
field_object.null=True
class Meta(ThreadResource.Meta):
resource_name = 'thread_suda'
usedgoodthread_fields = UsedgoodThreadResource.Meta.fields[:]
userdiscountinfothread_fields = UserDiscountinfoThreadResource.Meta.fields[:]
staffdiscountinfothread_fields = StaffDiscountinfoThreadResource.Meta.fields[:]
bitem_checklistthread_fields = BitemChecklistThreadResource.Meta.fields[:]
parent_field_set = set(ThreadResource.Meta.fields[:])
field_set = set(
set(usedgoodthread_fields) |
set(userdiscountinfothread_fields) |
set(staffdiscountinfothread_fields) |
set(bitem_checklistthread_fields)
)
fields = list(field_set)
inherited_fields = list(field_set - parent_field_set)
queryset = forum_models.Thread.objects.not_deleted().exclude(
thread_type__in=(forum_const.THREAD_TYPE_MOMSDIARY, forum_const.THREAD_TYPE_SOCIAL_DISCOUNTINFO)
).select_subclasses()