Django Rest Framework — обратные отношения

как вы включаете связанные поля в API?

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

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

У каждого Фу есть пара баров, связанных с ним, например изображения или что-то в этом роде.

Как мне отобразить эти бары в ресурсе Foo?

с deliciouspie это довольно просто, я не уверен с Django Rest Framework..


person Harry    schedule 10.01.2013    source источник


Ответы (3)


У меня это работает! Шит!

Хорошо, вот что я сделал:

Созданы сериализаторы, представления и URL-адреса для объекта Bar, как описано в документации по быстрому запуску Django REST Framework.

Затем в сериализаторе Foo я сделал следующее:

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

На самом деле это очень просто, я бы сказал, что документы просто не показывают это хорошо.

person Harry    schedule 10.01.2013
comment
Это не сработало для меня. Я получаю сообщение об ошибке, говорящее о том, что URL-адрес не может быть разрешен. Я добавил URL-адрес в свой rest/urls.py, и он работает. Не уверен, что я делаю неправильно. - person sweyrick; 25.01.2013

В наши дни вы можете добиться этого, просто добавив обратное отношение к кортежу fields.

В твоем случае:

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

Теперь набор «bar» будет включен в ваш ответ Foo.

person Marcus Lind    schedule 09.02.2016
comment
Я делаю то же самое, во вложенном ответе, скажем, есть 4 связанных бара, тогда я получаю 4 пустых json, я не знаю, почему это не работает, счетчик работает правильно - person Sugam; 01.10.2016
comment
Что произойдет, если модель bar будет называться SomethingBar? something_bar_set и somethingbar_set не работают :( - person Robert Johnstone; 24.06.2020

Я не мог заставить работать вышеописанное, потому что у меня есть модель под названием 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', 
        )
person Robert Johnstone    schedule 26.06.2020