2017-01-07 95 views
0

使用django rest-farmework来实现API,这里嵌套关系存在问题。不能显示与外键关联的内容,具体代码如下:django rest-farmework嵌套关系

models.py

class Category(models.Model): 
    name = models.CharField(max_length=30) 
    amount = models.IntegerField() 

class Source(models.Model): 
    name = models.CharField(max_length=50) 
    rss_link = models.URLField() 
    amount = models.IntegerField() 
    # ForeignKey 
    category = models.ForeignKey(Category) 

views.py

class CategoryListView(APIView): 
    def get(self, request): 
     category = Category.objects.all() 
     serializers = CategorySerializers(category, many=True) 
     return Response(serializers.data) 

serializers.py

class SourceSerializers(serializers.ModelSerializer): 
    class Meta: 
     model = Source 
     fields = ("id","name","amount") 

class CategorySerializers(serializers.ModelSerializer): 
    source = SourceSerializers(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = ("id","name","amount","source") 

程序运行结果:

[ 
    { 
     "id": 1, 
     "name": "默认分类", 
     "amount": 0 
    }, 
    { 
     "id": 2, 
     "name": "科技频道", 
     "amount": 0 
    } 
] 

为什么在结果中不能显示'source'?

我希望结果是这样的

[ 
    { 
     "id": 1, 
     "name": "默认分类", 
     "amount": "0", 
     "source": [ 
      { 
       "id": 34, 
       "name": "博客园", 
       "amount": "231" 
      }, 
      { 
       "id": 35, 
       "name": "CSDN", 
       "amount": "643" 
      } 
     ] 
    }, 
    { 
     "id": 2, 
     "name": "科技频道", 
     "amount": "0", 
     "source": [] 
    } 
] 
+1

您没有为ForeignKey的定义相关的名字,所以反向关系,默认为类似'source_set'。 –

+0

非常感谢,问题解决了。 – jason

回答

2

由于克劳斯·D的意见,问题就解决了。 我们可以在models.py添加related_name = 'source'这样的:

class Source(models.Model): 
    name = models.CharField(max_length=50) 
    rss_link = models.URLField() 
    amount = models.IntegerField() 
    # ForeignKey 
    category = models.ForeignKey(Category,related_name = 'source') 

如果你没有在添加外键related_name,默认为“source_set”。

所以,我们也可以解决这样的问题:

#serializers.py 
class CategorySerializers(serializers.ModelSerializer): 
    source_set = SourceSerializers(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = ("id","name","amount","source_set")