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
.