Django Rest Framework - 反向关系

时间:2013-01-10 16:38:14

标签: django django-rest-framework tastypie

如何在api中包含相关字段?

class Foo(models.Model):
    name = models.CharField(...)

class Bar(models.Model):
    foo = models.ForeignKey(Foo)
    description = models.CharField()

每个Foo都有几个与他有关的Bar,比如图像或者什么都有。

如何在Foo的资源中显示这些Bar?

使用tastypie它的退出简单,我不确定Django Rest Framework ..

3 个答案:

答案 0 :(得分:8)

我搞定了! Shweeet!

好的,这就是我所做的:

为Django REST Framework的快速入门文档中描述的Bar对象创建了序列化程序,视图和URLS。

然后在Foo Serializer中我这样做了:

class FooSerializer(serializers.HyperlinkedModelSerializer):
    # note the name bar should be the same than the model Bar
    bar = serializers.ManyHyperlinkedRelatedField(
        source='bar_set', # this is the model class name (and add set, this is how you call the reverse relation of bar)
        view_name='bar-detail' # the name of the URL, required
    )

    class Meta:
        model = Listing

Actualy它真的很简单,文档只是没有显示它我会说...

答案 1 :(得分:4)

现在,您可以通过简单地将反向关系添加到fields元组来实现此目的。

在你的情况下:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = (
            'name', 
            'bar_set', 
        )

现在" bar" -set将包含在您的Foo响应中。

答案 2 :(得分:0)

由于我有一个名为FooSomething的模型,因此无法正常工作。

我发现以下对我有用。

# models.py

class FooSomething(models.Model):
    name = models.CharField(...)

class Bar(models.Model):
    foo = models.ForeignKey(FooSomething, related_name='foosomethings')
    description = models.CharField()

# serializer.py

class FooSomethingSerializer(serializers.ModelSerializer):
    foosomethings = serializers.StringRelatedField(many=True)

    class Meta:
        model = FooSomething
        fields = (
            'name', 
            'foosomethings', 
        )