Django Rest Framework отображает отношение «многие ко многим» в API - PullRequest
0 голосов
/ 31 мая 2018

У моего маленького бэкэнда подкаста есть несколько моделей, одной из которых является Episode.Теперь есть два новых для гостей (Гость) и для тем (Тема) - оба из которых имеют от ManyToManyField до Episode.Это в основном работает как задумано в админке.Теперь мне нужно перенести это в API.

В подробном сериализаторе / представлении для каждого эпизода уже есть некоторые другие связанные данные (пока не многие ко многим).Я также проверил этот пост , но до сих пор не могу заставить его работать и думаю, что могу что-то упустить.

Вот суть только для гостевого примера, чтобы сохранить его плотным, тема буквально идентична:

Модель эпизода:

class Episode(models.Model):
    number          = models.CharField(max_length=10, blank=False)
    title           = models.CharField(max_length=100, blank=False)
    show            = models.ForeignKey(Show, on_delete=models.PROTECT)
    created_at      = models.DateTimeField(auto_now=False)
    published_at    = models.DateTimeField(auto_now=False)
    updated_at      = models.DateTimeField(auto_now=False)
    cover_image     = models.URLField(null=True)

    def __str__(self):
        return self.title

Модель гостя:

class Guest(models.Model):
    episodes        = models.ManyToManyField(Episode)
    name            = models.CharField(max_length=100, blank=False)
    twitter         = models.CharField(max_length=20, null=True)

    def __str__(self):
        return self.name

Сериализатор:

class GuestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Guest
        fields = ('name',)

Сериализатор эпизода, где он должен появляться:

class EpisodeDetailSerializer(serializers.ModelSerializer):
    ...
    guest = GuestSerializer(many=True, read_only=True)
    topic = TopicSerializer(many=True, read_only=True)

    class Meta:
        model = Episode
        fields = (..., 'guest', 'topic')
        depth = 1

Я поместил некоторые данные для гостей и тем, но не могу отобразить их в API.Я также попробовал «Guest.episodes.through», как будто он у меня есть у администратора для Inline Admin Classes, но это ничего не изменило.

1 Ответ

0 голосов
/ 01 июня 2018

Ваша модель Episode не имеет прямых связей с вашими моделями Guest или Topic.По этой причине ваш сериализатор Episode должен стремиться сериализовать guest_set и topic_set вместо guest и topic.

Если вы укажете связанное имя для этих полей M2M, вы можете настроить соглашение об именах здесь.Прямо сейчас у вас есть это:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode)
    ...

Это означает, что, чтобы добраться до всех Guests, связанных с данным Episode, называемым ep, обратный поиск будет ep.guest_set.all().Определите связанное имя, и вы можете назвать средний термин как хотите:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode, related_name='guests')
    ...

При этом вы можете использовать ep.guests.all(), и вы можете обновить ваш сериализатор Episode, чтобы искать guests в противоположностьдо guest_set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...