我正在寻找为用户创建一个模型来为食谱添加书签。我有以下内容,其中配方值通过 POST 请求传递:
模型.py
class PublishedRecipeBookmark(models.Model):
recipe = models.ForeignKey(
PublishedRecipe, on_delete=models.PROTECT, related_name="bookmarks"
)
bookmarked_by = models.ForeignKey(User, on_delete=models.PROTECT)
bookmarked_at = models.DateTimeField(auto_now_add=True)
序列化程序.py
class PublishedRecipeBookmarkSerializer(serializers.ModelSerializer):
bookmarked_by = UserSerializer(read_only=True)
class Meta:
model = models.PublishedRecipeBookmark
fields = ["recipe", "bookmarked_by", "bookmarked_at"]
def create(self, validated_data):
request = self.context["request"]
ModelClass = self.Meta.model
instance = ModelClass.objects.create(
**validated_data, **{"bookmarked_by": request.user}
)
return instance
视图.py
@permission_classes([IsAuthenticated])
class PublishedRecipeBookmarkView(generics.CreateAPIView):
queryset = models.PublishedRecipeBookmark.objects.all()
serializer_class = PublishedRecipeBookmarkSerializer
网址.py
path("published-recipes/bookmarks", PublishedRecipeBookmarkView.as_view()),
我想将 url 更改为这样的内容,以便通过 url (int:id) 传递 recipeid。
网址.py
path("published-recipes/bookmarks/<int:id>", PublishedRecipeBookmarkView.as_view()),
如何实现这一点,以便视图将 id 识别为 PublishedRecipe 的 recipeid(在模型中建立了外键关系)?
更新,因为这是一个不同的问题,上面已经回答了。
正如您当前的序列化程序所期望的那样,将配方 ID 放在请求正文中会更有意义。
作为约定:
published-recipes/bookmarks/<int:id>
id
这里将对应于书签 id,并将其视为配方 id 将 IMO 是不好的做法,并且会混淆将使用此代码的其他人。
但是,如果您确定并且确实想要这样做,则可以覆盖视图的create
方法:
@permission_classes([IsAuthenticated])
class PublishedRecipeBookmarkView(generics.CreateAPIView):
queryset = models.PublishedRecipeBookmark.objects.all()
serializer_class = PublishedRecipeBookmarkSerializer
def create(self, request, id, *args, **kwargs):
... # do what you want with id here
或从kwargs
:
def create(self, request, *args, **kwargs):
id = kwargs.get('id')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句