如何在 django rest 框架中列出来自特定模型的所有对象?

Posted

技术标签:

【中文标题】如何在 django rest 框架中列出来自特定模型的所有对象?【英文标题】:How to list all objects from particular model in django rest framework? 【发布时间】:2022-01-21 22:42:24 【问题描述】:

我有两个模型

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(default=0, decimal_places=2, max_digits=10)

    def __str__(self):
        return self.name
class Receipt(models.Model):
    purchase_date = models.DateTimeField(auto_now=True, null=False)
    shop = models.ForeignKey(Shop, on_delete=models.SET_NULL, null=True)
    products = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return super().__str__()

我的收据网址如下所示:

我希望它显示所有产品的列表,而不是其中的数量。如何做到这一点?

我的观点集:

class ReceiptViewSet(viewsets.ModelViewSet):
    queryset = Receipt.objects.all()
    serializer_class = ReceiptSerializer
    permission_classes = [AllowAny]

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [AllowAny]
    enter code here

序列化器:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price']

class ReceiptSerializer(serializers.HyperlinkedModelSerializer):
    products = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Receipt
        fields = ['id', 'purchase_date', 'shop', 'products']

【问题讨论】:

分享你的序列化器? 抱歉,我更新了我的问题并在那里添加了序列化程序 【参考方案1】:

我已经尝试过 Sumithran 的解决方案,但我做了一个小的调整,而不是使用 serializers.HyperlinkedModelSerializer 我使用了 serializers.ModelSerializer,它显示的产品如下View

希望它能回答您正在寻找的内容:)

from rest_framework import serializers

class ReciptSerializer(serializers.ModelSerializer):
    class Meta:
        model = Receipt
        fields = ['id', 'purchase_date', 'shop', 'products']
        depth = 1

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

【讨论】:

答案中应包含更改。 谢谢你通知我,我更新了我的答案@mstgnz【参考方案2】:

您可以使用depth 选项简单地指定嵌套表示

试试这个

class ReceiptSerializer(serializers.HyperlinkedModelSerializer):
    ... 

    class Meta:
        model = Receipt
        fields = ['id', 'purchase_date', 'shop', 'products']
        depth = 1

否则

class ReceiptSerializer(serializers.HyperlinkedModelSerializer):
    products = ProductSerializer(many=True, read_only=True)
    ... 

    class Meta:
        model = Receipt
        fields = ['id', 'purchase_date', 'shop', 'products']

【讨论】:

我试过了,它告诉我:TypeError at /receipts/ 'Product' object is not iterable @santana011 删除many=True 再试一次,顺便说一句,我真的不明白你为什么用复数命名相关连接 @santana011 第一种方法怎么样? 它有效,但我不明白为什么收据只能有一种产品。每当我尝试向收据添加另一个产品时,它都会切换它们 Foreiginkey 只能有一个关系,在您的方案中,您可以实现多对多关系的反向外键。

以上是关于如何在 django rest 框架中列出来自特定模型的所有对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?

如何在 django rest 框架中添加自定义权限和角色

如何在 React 中显示来自 django-rest-framework 的错误消息

django rest 框架,order_by 来自 serializers.py 文件的 JSON

来自 django rest 框架的 JSON

如何在 django rest 框架中的嵌套序列化器相关对象上使用 prefetch_related?