Как получить доступ к атрибутам модели ForeignKey в Angular, используя сериализованные данные из Django - PullRequest
0 голосов
/ 25 января 2020

Я использую Angular 8 и Django 3. Я хочу создать страницу для Restaurant, которая показывает все Recipes, которые есть у Restaurant. У меня есть модель Restaurant и модель Recipe с отношением ForeignKey следующим образом:

РЕДАКТИРОВАТЬ: models.py

class Restaurant(models.Model):
    name = models.CharField(max_length=100)


class Recipe(models.Model):
    name = models.CharField(max_length=30)

    restaurant = models.ForeignKey(Restaurant, related_name='recipe', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

Я сериализирую данные для Restaurant, используя PrimaryKeyRelatedField:

serializers.py

class RestaurantDetail(serializers.ModelSerializer):
    recipe = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Restaurant
        fields = ('id', 'name', 'food', 'recipe')

Когда я вставляю URL ( http://127.0.0.1:8000/restaurants/restaurantdetail/2) в Почтальоне я получаю правильные данные ответа, потому что он дает мне имя Restaurant, а также массив значений Recipe pk, которые относятся к Restaurant. Поэтому я сериализуюсь правильно.

{
    "id": 2,
    "name": "sec",
    "recipe": [
        3,
        4
    ]
}

Однако я хочу, чтобы в моем файле Angular html был доступ к имени каждого Recipe в массиве. Все, что я могу получить, это pk значение, когда я oop по массиву. Есть ли простой способ сделать это или мне нужно создать еще один компонент Angular, который идет и ищет и возвращает новый объект Recipe для каждого значения pk.

Другими словами, я предполагаю, что сериализатор не возвращает объект Recipe, а просто его значение pk?

1 Ответ

0 голосов
/ 25 января 2020

Я решил это с помощью вложенной сериализации. Это хорошая ссылка на документы Вложенная сериализация

serializers.py

class RecipeShort(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('id','name')


class RestaurantDetail(serializers.ModelSerializer):
    recipe = RecipeShort(many=True, read_only=True)

    class Meta:
        model = Restaurant
        fields = ('id', 'name', 'food', 'recipe')
...