Словарь вместо списка в DjangoRestFramework
На данный момент я получаю 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])
Источник: Stack Overflow на русском