python - 如何将 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(在模型中建立外键关系)?
更新,因为这是一个不同的问题,上面已经回答了。
解决方案
正如您当前的序列化程序中已经预期的那样,将配方 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')
推荐阅读
- string - 从一个点读取一个字符串
- java - 如何部署 Java 服务器应用程序?
- php - 尝试从 API 检索数据时未定义过滤数据
- java - 如何使用 JPA/Spring/Hibernate 对表行强制执行写锁定
- kubernetes-ingress - 将网址从 www.example.com/page 重定向到入口中的其他域 www.abc.com/page
- python - Python连接pymongo
- python - Python pandas编辑多行
- angular - 如何将图例中的标签和数据与 Chartjs Angular 对齐
- python - 我面临 ModuleNotFoundError: No module named 'testCases' while running a code in google collab what to do
- parameters - 在 AnyLogic 中指定特定 GIS 点或长/纬度坐标的参数