Django REST Framework: не удается правильно аннотировать значения для модели "многие-ко-многим", постоянно возникает ошибка Field name <field> is not valid for model <m2m model>

У меня есть модель для рецептов и модель "многие-ко-многим", которая представляет любимые рецепты пользователей:

class Recipe(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=LENGTH_FOR_TEXTFIELD)
    image = models.ImageField()
    text = models.TextField(max_length=LENGTH_FOR_TEXTFIELD)
    cooking_time = models.PositiveSmallIntegerField()

    def __str__(self):
        return self.name
class FavoriteRecipe(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.recipe.name

После POST-запроса создается запись в этой модели (ID рецепта и ID пользователя), и я пытаюсь написать сериализатор для ответа, который будет содержать информацию о самом рецепте:

class FavoriteRecipeSerializerForRead(serializers.ModelSerializer):

    class Meta:
        model = FavoriteRecipe
        fields = ('id', 'name', 'image', 'cooking_time')

Проблема в том, что я не могу вставить в этот сериализатор ни одного рецепта-поля, потому что постоянно получаю ошибку:

django.core.exceptions.ImproperlyConfigured: Field name `name` is not valid for model `FavoriteRecipe`

Я пытался наложить select_related() и .annotate(field=Value(Query)) в моем наборе представлений следующим образом, но, похоже, ничего не работает:

class FavoriteRecipeViewSet(viewsets.ModelViewSet):
    queryset = FavoriteRecipe.objects.all()
    serializer_class = FavoriteRecipeSerializerForRead

    def get_queryset(self):
        queryset = FavoriteRecipe.objects.all().annotate(
            name=Value(
                Recipe.objects.filter(id=self.id).values('cooking_time',)
            )
        )
        return queryset

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

Почему бы не сериализовать Recipe?

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

Мы можем использовать это для Recipe, которые не являются Favorite одним.

В ViewSet мы можем работать с избранными Recipe пользователями:

class FavoriteRecipeViewSet(viewsets.ModelViewSet):
    queryset = Recipe.objects.all()
    serializer_class = RecipeSerializer

    def get_queryset(self):
        return Recipe.objects.filter(favoriterecipe__user=self.request.user)

Вам нужно добавить аутентификацию [drf-doc], чтобы обеспечить наличие request.user.

Вернуться на верх