5

Tastypie を使用して、関連するモデルにフィールドを含めることは可能ですか?

以下のモデルによると、1 つの VideoContent と 1 つの TextContent インスタンスを DB に永続化すると、コンテンツ リソースから 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
4

2 に答える 2

0

同じ要件があり、最終的に解決しました。

クエリセットと再ソートを組み合わせるという考えが気に入らなかったため、上記のリンクにある回答は気に入りませんでした。

どうやら、複数のリソースを継承できます。

複数のリソースをサブクラス化することで、リソースのフィールドを含めます。
これらのフィールドは各リソースに固有であるため、init で null 可能にしました。

親を一度だけリストする方法があるのだろうか。(現在は 2 つあります。1 つはサブクラス用、もう 1 つはメタ用です)

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()
于 2013-12-25T09:50:19.120 に答える