django rest framework 外键序列化方法与问题总结

1 篇文章 0 订阅
1 篇文章 0 订阅



为前端提供数据时,往往是这样的json

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': 01
}......

如果需要外键字段对应表的详细信息,像这样

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}
要怎么配置?

查看 django rest framework 官网说明http://www.django-rest-framework.org/api-guide/relations/  

虽然讲到了怎么操作,但是不详细,屡屡遇坑

所用到的model

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album,   on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)
配置serializer


class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')
好像搞定了,运行起来才发现有个坑

Got AttributeError when attempting to get a value for field 'tracks' on serializer 'AlbumSerializer'
没有tracks字段,咋整?
原来只要在model foreignkey里面添加
 related_name='tracks',
 album = models.ForeignKey(Album,  related_name='tracks', on_delete=models.CASCADE)

就搞定了。。

官网例子里有,但是很容易忽略,这里提出来,希望大家注意


为前端提供数据时,往往是这样的json

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': 01
}......

如果需要外键字段对应表的详细信息,像这样

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}
要怎么配置?

查看 django rest framework 官网说明http://www.django-rest-framework.org/api-guide/relations/  

虽然讲到了怎么操作,但是不详细,屡屡遇坑

所用到的model

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album,   on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)
配置serializer


class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')
好像搞定了,运行起来才发现有个坑

Got AttributeError when attempting to get a value for field 'tracks' on serializer 'AlbumSerializer'
没有tracks字段,咋整?
原来只要在model foreignkey里面添加
 related_name='tracks',
 album = models.ForeignKey(Album,  related_name='tracks', on_delete=models.CASCADE)

就搞定了。。

官网例子里有,但是很容易忽略,这里提出来,希望大家注意

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值