Django REST Framework:无法正确注释多对多模型的值,不断收到错误字段名称<field>对于模型无效<m2m model>

问题描述 投票:0回答:1

我有一个食谱模型和代表用户最喜欢的食谱的多对多模型:

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_lated() 和 .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

问题是:我怎样才能以正确的方式做到这一点?

python django django-models django-rest-framework django-queryset
1个回答
0
投票

为什么不序列化

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

© www.soinside.com 2019 - 2024. All rights reserved.