我有一个名为TrackMinResource的API端点,该端点返回音乐曲目的最少数据,包括以ArtistMinResource返回的曲目主要艺术家。这是两者的定义:

class TrackMinResource(ModelResource):
    artist = fields.ForeignKey(ArtistMinResource, 'artist', full=True)

    class Meta:
        queryset = Track.objects.all()
        resource_name = 'track-min'
        fields = ['id', 'artist', 'track_name', 'label', 'release_year', 'release_name']
        include_resource_uri = False
        cache = SimpleCache(public=True)

    def dehydrate(self, bundle):
        bundle.data['full_artist_name'] = bundle.obj.full_artist_name()
        if bundle.obj.image_url != settings.NO_TRACK_IMAGE:
            bundle.data['image_url'] = bundle.obj.image_url

class ArtistMinResource(ModelResource):
    class Meta:
        queryset = Artist.objects.all()
        resource_name = 'artist-min'
        fields = ['id', 'artist_name']
        cache = SimpleCache(public=True)

    def get_resource_uri(self, bundle_or_obj):
        return '/api/v1/artist/' + str(bundle_or_obj.obj.id) + '/'


问题是,artist(以前是Track)上的ForeignKey字段现在是称为main_artist的模型方法(我已经对数据库的结构进行了一些更改,但是我希望API返回与之前相同的数据)。因此,我收到此错误:

{"error": "The model '<Track: TrackName>' has an empty attribute 'artist' and doesn't allow a null value."}


如果我从full=True的'artist'字段中取出TrackMinResource并添加null=True,则返回的数据中的artist字段将为空值。如果然后我在dehydrate中分配艺术家,如下所示:

bundle.data['artist'] = bundle.obj.main_artist()


...我只是在返回的JSON中获取歌手姓名,而不是代表dictArtistMinResource(以及我需要的相关resource_uri)。

知道如何将这些ArtistMinResource放入我的TrackMinResource吗?我可以使用URL端点访问一个很好的ArtistMinResource,并按ID要求。是否有从dehydrateTrackMinResource函数中获取结果的函数?

最佳答案

您可以像这样在TrackMinResource的脱水中使用ArtistMinResource(假设main_artist()返回了ArtistMinResource表示的对象):

artist_resource = ArtistMinResource()
artist_bundle = artist_resource.build_bundle(obj=bundle.obj.main_artist(), request=request)
artist_bundle = artist_resource.full_dehydrate(artist_bundle)
artist_json = artist_resource.serialize(request=request, data=artist_bundle, format='application/json')


artist_json现在应包含您的完整艺术家表示。另外,我很确定如果传递请求,并且其中填充了内容类型标头,则不必传递格式。

关于python - 动态领域的外键资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29079906/

10-12 16:45