我有一个食谱模型和代表用户最喜欢的食谱的多对多模型:
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
问题是:我怎样才能以正确的方式做到这一点?
为什么不序列化
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
。