首页 > 解决方案 > 如何将 url id 设置为特定字段 django

问题描述

我正在寻找为用户创建一个模型来为食谱添加书签。我有以下内容,其中配方值通过 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(在模型中建立外键关系)?

更新,因为这是一个不同的问题,上面已经回答了。

标签: pythondjangodjango-rest-framework

解决方案


正如您当前的序列化程序中已经预期的那样,将配方 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')

推荐阅读