django中的模型视图集

Posted

技术标签:

【中文标题】django中的模型视图集【英文标题】:ModelViewset in django 【发布时间】:2022-01-02 12:00:46 【问题描述】:

我是 Django Rest-framework 的新手。我使用 Modelviewset 为项目创建 API。我想获取不是通过 id 的事物列表,我使用 lookup_field 来做到这一点。但它只返回 1 个对象。如何自定义它以返回多个对象?

这是我的模特

class Rating(models.Model):
    dayandtime = models.DateTimeField(auto_now_add=True)
    ratingpoint = models.IntegerField(null=True,blank=True)
    ratingcomment = models.TextField(null=True, blank=True)
    img = models.ImageField(upload_to='static',default=None)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE)

这是我的看法

class RatingViewSet(viewsets.ModelViewSet):
    queryset = Rating.objects.all()
    serializer_class = RatingSerializer
    lookup_field = "product"

这是我的序列化器

class RatingSerializer(ModelSerializer):
    class Meta:
        model=Rating
        fields=["id","dayandtime","ratingpoint", "ratingcomment","img","product","user"]
        lookup_field = "product" 

请帮我解决这个问题。非常感谢

【问题讨论】:

【参考方案1】:

您想在 api 上使用过滤器并返回多个对象。但是lookup_field 用于执行单个模型实例的对象查找。 有很多方法可以实现你的目标,但我会告诉你filter by query parameters。

您可以覆盖get_queryset() 来处理http://yourdoamin.com/api/ratings?product=1 等URL(这里我们假设您要按产品ID 过滤)。

class RatingViewSet(viewsets.ModelViewSet):
    serializer_class = RatingSerializer

    def get_queryset(self):
        queryset = Rating.objects.all()
        product= self.request.query_params.get('product')
        if product not None:
            queryset = queryset.filter(product_id=product)
        return queryset

当然,你可以添加很多if/elif/else块来处理很多查询参数。

你也可以使用类似的方法:The SearchFilter class来达到同样的目的。

更多信息请关注DRF filtering documentation

【讨论】:

以上是关于django中的模型视图集的主要内容,如果未能解决你的问题,请参考以下文章

使用Django Rest Framework中的APIClient帖子测试多个文件上传到模型视图集

django rest框架中的泛型与视图集,如何选择使用哪一个?

django-rest-framework框架总结之View视图之APIViewGenericAPIView视图集ViewSet

如何将两个不同的ListAPIView转换为单个ModelViewSet

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)