Tastypie访问字段从继承模型(Tastypie accessing fields from i

2019-08-01 04:29发布

是否有可能包括对相关车型领域,使用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

Answer 1:

我发现了另一个答案一个很好的解决方案

填充一个tastypie资源的多表继承的Django模型


我碰到了同样的问题 - 尽管我仍然在解决它的中间。 我到目前为止已经想通了两件事情:

Django的模型utils的提供了一个传承的经理,让您使用的抽象基类来查询它的表,可以自动向下转换查询结果。

有一点要看看是脱水/水化可用资源类的方法。

这是我做的:

class CommandResource(ModelResource):

   class Meta:
        queryset = Command.objects.select_subclasses().all()

这只是让你一半-资源还必须包括脱水/水化的东西,因为你必须手工打包对象了来自用户的传输(或recieving)。

现在我意识到的事情是,这是超级哈克而且也得是由tastypie提供了更好/更清洁的方式 - 他们不能指望你必须这样做型手动重新包装在这些类型的情况 - 但是,也许他们是这样。 我只有约8小时与tastypie经验@这一点,所以如果我解释这一切错误也许一些不错的计算器,用户可以设置我直。 :d:d:d



Answer 2:

我有同样的要求,终于解决了这个问题。

我不喜欢在上面给出的链接,因为我不喜欢组合查询集和重新排序的想法的答案。

显然,你可以继承多个资源。

通过继承多个资源,包括资源的领域。
而且,由于这些领域各自独有的资源,我让他们在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()


文章来源: Tastypie accessing fields from inherited models