Словарь вместо списка в DjangoRestFramework

Рейтинг: 0Ответов: 1Опубликовано: 15.02.2023

На данный момент я получаю JSON данные, в котором если у модели есть поля отношений(ForeignKey), мне выдается список диктов то как не надо!, а нужно просто дикт то как надо! Со слов понять трудновато, простите. Утилита, которая принимает данные категорически не хочет меняться, поэтому мне нужно отдавать ей данные формата как она требует. Заранее благодарен!

Model.py

class MainModelClass(models.Model):
    title = models.CharField(max_length=255, null=True,
                             blank=True, verbose_name='title', help_text='description')
    ...


class ProxyHosts(models.Model):
    proxy_hosts = models.ForeignKey(MainModelClass, related_name='proxy_hosts', on_delete=models.PROTECT, null=True, blank=True, verbose_name='Main data', help_text='description')
    host = models.CharField(max_length=255,null=True, blank=True, verbose_name='host', help_text='description')
    ...

class CheckResult(models.Model):
    check_result = models.ForeignKey(ProxyHosts, related_name='check_result', on_delete=models.PROTECT, null=True,blank=True, verbose_name='host', help_text='description')



class SearchFor(models.Model):
    search_for = models.ForeignKey(CheckResult, on_delete=models.CASCADE, related_name='search_for', null=True, blank=True, verbose_name='searchFor for', help_text='description')
    tag_name = models.CharField(max_length=255, null=True, blank=True, verbose_name='tagName', help_text='description')
    attribute_name = models.CharField(max_length=255, null=True, blank=True, verbose_name='attributeName', help_text='description')
    attribute_value = models.CharField(max_length=255, null=True, blank=True, verbose_name='attributeValue', help_text='description')

    def __str__(self):
        return f"SearchFor for {self.search_for}"


class CheckingValue(models.Model):
    checking_value = models.ForeignKey(CheckResult, on_delete=models.CASCADE, related_name='checking_value', null=True, blank=True, verbose_name='checkingValue for', help_text='description')
    attribute_name = models.CharField(max_length=255, null=True, blank=True, verbose_name='attributeName', help_text='description')
    html = models.CharField(max_length=255, null=True, blank=True, verbose_name='html', help_text='description')
    element_value = models.CharField(max_length=255, null=True, blank=True, verbose_name='elementValue', help_text='description')

    def __str__(self):
        return f"CheckingValue for {self.checking_value}" 

serializers.py

class CheckingValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = CheckingValue
        fields = ["attribute_name", 'html', 'element_value']


class SearchForSerializer(serializers.ModelSerializer):
    class Meta:
        model = SearchFor
        fields = ["tag_name", 'attribute_name', 'attribute_value']


class CheckResultSerializer(serializers.ModelSerializer):
    search_for = SearchForSerializer(many=True, read_only=True)
    checking_value = CheckingValueSerializer(many=True, read_only=True)

    class Meta:
        model = CheckResult
        fields = ["search_for", "checking_value"]

class MainSerializer(serializers.ModelSerializer):
    proxy_hosts = ProxyHostsSerializer(many=True, read_only=True)

    class Meta:
        model = MainModelClass
        fields = [ ... ,'proxy_hosts']

class ProxyHostsSerializer(serializers.ModelSerializer):
    check_result = CheckResultSerializer(many=True, read_only=True)

    class Meta:
        model = ProxyHosts
        fields = ['host', ... , 'check_result']

view.py

class MainViewSet(ListAPIView):
    queryset = MainModelClass.objects.filter(is_published=True)
    serializer_class = MainSerializer


    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data[0])

Ответы

▲ 0

Частично я сделал. Я немного изменил сериализатор, добавил source=... и у меня получилсявот такой формат данных Как убрать еще одну скобку, пока не знаю, усложняется тем что это форенкей

serializers.py


class CheckingValueSerializer(serializers.ModelSerializer):
    attributeName = serializers.CharField(source='all.first.attributeName')
    html = serializers.CharField(source='all.first.html')
    elementValue = serializers.CharField(source='all.first.elementValue')
    class Meta:
        model = CheckingValue
        fields = ["attributeName", 'html', 'elementValue']

class SearchForSerializer(serializers.ModelSerializer):
    tagName = serializers.CharField(source='all.first.tagName')
    attributeName = serializers.CharField(source='all.first.attributeName')
    attributeValue = serializers.CharField(source='all.first.attributeValue')

    class Meta:
        model = SearchFor
        fields = ["tagName", 'attributeName', 'attributeValue']