【问题标题】:How to make it by list comprehension如何通过列表理解来实现
【发布时间】:2022-06-14 00:21:43
【问题描述】:

我需要将父列表下的子列表作为一个组。

class ServiceTypeViewSet(ModelViewSet):
    serializer_class = ServiceTypeSerializer
    http_method_names = ["get"]
    queryset = ServiceType.objects.all()
    
    def get_queryset(self):
        """
        This view should return a list of all the service types.
        """
        servicetype_list = ServiceType.objects.all()
        return servicetype_list

它显示:

    [
        {
            "id": 1,
            "cleaning_type": "Lite service",
            "service_name": "Floors",
            
        },
        {
            "id": 2,
            "cleaning_type": "Lite service",
            "service_name": "Bathrooms",
            
        },
        {
            "id": 3,
            "cleaning_type": "Lite service",
            "service_name": "Kitchen",
            
        }
    ]

我希望它采用以下格式:

 [
  {
    id: 1,
    cleaning_type: 'Lite service',
    service_name: ['Floors', 'bathroom', 'kitchen'],
  },
  {
    id: 2,
    cleaning_type: 'Moving cleaning',
    service_name: ['Kitchen Including All Appliances And Cabinets'],
  },
]

这意味着所有子元素都将位于单独的父列表下。不是一个个分开。

models.py 在这里:

清洗型型号:

class CleaningType(models.Model):
    cleaning_type_name = models.CharField(
        _("Select Cleaning Type"), blank=True, null=True, max_length=255)

    price = models.DecimalField(default=0,max_digits=6, decimal_places=2)    

    def __str__(self):
        return self.cleaning_type_name

服务模式:

class Service(models.Model):

cleaning_type = models.ForeignKey(
    CleaningType, on_delete=models.CASCADE)
service_name = models.CharField(
    _("Service Name"), blank=True, null=True, max_length=255)

  

#string type added
def __str__(self):
    return str(self.service_name)
    

我想要父餐饮下的子类别。这里cleaning_type是父类,service是cleaning_type的子类。即:cleaning_type >> service_type

【问题讨论】:

  • 要合并多个服务对象吗?
  • @DavidLu 是的。我想组合几个服务对象。
  • 但是不知道怎么组合?他们如何被视为同一组?
  • @DavidLu 如果您认为这些子类别,那么我想要父类别下的子类别。这里cleaning_type是父类,service_type是cleaning_type的子类。即:cleaning_type >> service_type
  • 那我觉得数据库设计不好。

标签: django-models django-rest-framework


【解决方案1】:

首先,您需要将 cleaningtype 字段移动到 ServiceType 模型中。 而且我认为最好从目标模型的角度设置related_name

class ServiceType(models.Model):
    cleaningtype = models.ForeignKey(
        CleaningType, related_name='service_types', on_delete=models.CASCADE)     
    ...

class Service(models.Model):        
    servicetype = models.ForeignKey(
        ServiceType, related_name='services', on_delete=models.CASCADE)
    service_name = models.CharField(
        _("Service Name"), blank=True, null=True, max_length=255)
    
    #string type added
    def __str__(self):
        return str(self.service_name)

CleaningTypeSerializer

class CleaningTypeSerializer(serializers.ModelSerializer):
    service_objects = ServiceTypeSerializer(many = True, read_only = True)
    service_types = serializers.SerializerMethodField()
    
    class Meta:
        Model = CleaningType
        fields = ('id', 'cleaning_type', 'service_types',)
   
    def get_service_types(self, obj):
        return list(obj.service_types.values_list('service_type').distinct())

终于在views.py中,

class CleaningTypesViewSet(ModelViewSet):
    serializer_class = CleaningTypeSerializer
    queryset = CleaningType.objects.all()

您可以从此CleaningTypesViewSet获取CleaningType数据列表。

【讨论】:

  • 我听从了你的回答。它显示错误。谢谢。
  • 你能显示错误吗?
  • 你在哪里定义service_types字段?
猜你喜欢
  • 2012-12-03
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多