我有一个名为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中获取歌手姓名,而不是代表
dict
的ArtistMinResource
(以及我需要的相关resource_uri
)。知道如何将这些
ArtistMinResource
放入我的TrackMinResource
吗?我可以使用URL端点访问一个很好的ArtistMinResource
,并按ID要求。是否有从dehydrate
的TrackMinResource
函数中获取结果的函数? 最佳答案
您可以像这样在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/