如何在Django中实现Django嵌套序列化程序中的左连接

2024-05-29 06:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的型号规格。MailingList是客户和电子邮件之间的参考表/模型。它还有几个其他属性,这些属性在应用过滤器时非常有用。我的目标是应用一些过滤器,然后返回序列化结果。结果应包括客户的订单

models.py

class Email(models.Model):
    name = models.CharField(max_length=300, unique=True)

class Item(models.Model):
    name = models.CharField(max_length=50)

class Customer(models.Model):
    passport_number = models.CharField(max_length=20, unique=True)
    name = models.CharField(max_length=20)

class Order(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

class MailingList(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    email = models.ForeignKey(Email, on_delete=models.CASCADE)

序列化程序.py

class CustomerSerializer(serializers.ModelSerializer):
    passport = serializers.CharField(source='customer.passport_number')
    customer_name = serializers.CharField(source='customer.name')

    # I want to add the orders for each customer too

    class Meta:
        model = MailingList
        fields = ['passport', 'customer_name']

views.py

class CustomerViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = MailingList.objects.filter(some_filters).prefetch_related('customer')

        serializer = CustomerSerializer(queryset, many=True)
        return serializer.data

这是我目前得到的答复

[
    {passport: 48, name: "Collins"},
    {passport: 32, name: "Kate"}
]

这是我想要得到的回应

[
    {passport: 48, name: "Collins", orders: {"1": "Hp EliteDisplay", "2": "Sony a7iii"}},
    {passport: 32, name: "Kate" orders: {}}
]

问题:如何在同一个响应中嵌入订单


Tags: namepymodelonmodelscustomerdeletelength
1条回答
网友
1楼 · 发布于 2024-05-29 06:00:50

使用 https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

class CustomerSerializer(serializers.ModelSerializer):
    passport = serializers.CharField(source='customer.passport_number')
    customer_name = serializers.CharField(source='customer.name')
    orders = serializers.SerializerMethodField()

    def get_orders(self, mailing_list):
      return OrderSerializer(queryset=mailing_list.customer.order_set.all(), many=True)

    # I want to add the orders for each customer too

    class Meta:
        model = MailingList
        fields = ['passport', 'customer_name', 'orders']

相关问题 更多 >

    热门问题