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