【问题标题】:Django Rest Framework - Group data by its parent tagDjango Rest Framework - 按其父标签分组数据
【发布时间】:2021-02-26 21:34:13
【问题描述】:

Django Rest Framework - 按父标签分组数据

我有 3 个序列化器,一个用于战术,一个用于技术,一个用于子技术,我将把子技术序列化器作为显式字段添加到技术序列化器中。

型号

class Tag(models.Model):
    _id = models.CharField(max_length=10)
    name = models.CharField(max_length=100)

    def __str__(self):
        return self._id

    def __unicode__(self):
        return self._id

class ModelA(models.Model):
    _id = models.CharField(max_length=10)
    title = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)
    queries = ArrayField(models.TextField(),null=True, blank=True, default=list)

    def __str__(self):
        return self._id

    def __unicode__(self):
        return self._id

class ModelB(models.Model):
    subtitle = models.ForeignKey(ModelA, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.subtitle
    

序列化器

# serializers
class TagSerializer(serializers.ModelSerializer):

    def to_representation(self, value):
        print(value)
        return value.name

    class Meta:
        model = Tag
        fields = ('name',)

class QueriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelB
        fields = '__all__'

class ASerializer(serializers.ModelSerializer):
    queries = QueriesSerializer(source='modelb_set', many=True)
    tag = TagSerializer(many=True)

    class Meta:
        model = ModelA
        fields = ('_id','title', 'tag','queries',)


class EndUserSerializer(serializers.ModelSerializer):
    data = ??

    class Meta:
        model = ??
        fields = '__all__'

我想创建一个数据可视化 API,我需要通过给定标签使用 ASerializer 的结果,以便根据其关联标签将每个对象分类为类别,如果对象包含两个标签,那么它应该显示在两个都 。例如

期望的响应

{
    [
        {
            "tag": "Biologyl,
            "data":  [
                {
                    "_id": str
                    "title": str
                    "tag": []
                    "queries": []
                }
            ]
        },
        {
            "tag": "Denoi2,
            "data":  [
                {
                    "_id": str
                    "title": str
                    "tag": []
                    "queries": []
                }
            ]
        },
    ]
}

实际反应

{
    "_id": str
    "title": str
    "tag": []
    "queries": []
}

视图集

#viewsets   
class BooksViewSet(mixins.ListModelMixin,
                      viewsets.GenericViewSet):

    queryset = ??.objects.all()
    serializer_class = EndUserSerializer

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以使用django-rest-multiple-models 在同一视图中接收多个查询集。

    https://github.com/MattBroach/DjangoRestMultipleModels

    应该是这样的:

    class BooksViewSet(ObjectMultipleModelAPIView):
        querylist = [
            {
                'querylist': ModelA.objects.filter(tags__name="Biologyl"),
                'serializer_class': EndUserSerializer,
                'label': 'Biologyl',
            },
            {
                'querylist': ModelA.objects.filter(tags__name="Denoi2"),
                'serializer_class': EndUserSerializer,
                'label': 'Denoi2',
            },
            ....
        ]
    

    你也可以让它动态化,但是看起来有点危险?。

    class BooksViewSet(ObjectMultipleModelAPIView):
        querylist = [
            {
                'querylist': ModelA.objects.filter(tags=tag),
                'serializer_class': EndUserSerializer,
                'label': tag.name,
            }
            for tag in Tag.objects.all()
        ]
    

    查看更多https://django-rest-multiple-models.readthedocs.io/en/latest/object-options.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-20
      • 2018-03-14
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多