Ответ Django Nested Relation API - PullRequest
       15

Ответ Django Nested Relation API

0 голосов
/ 25 апреля 2019

У меня есть две модели District и BTS.Я хочу получить ответ, как показано ниже.

[{
    "id": 15,
    "name": "Westen",
    "page": 1,
    "expanded": false,
    "selected": false,
    "children": [{
        "id": 12,
        "name": "BTS2",
        "page": 1
    }]
}, {
    "id": 13,
    "name": "Noth",
    "page": 1,
    "children": [{
        "id": 13,
        "name": "BTS2",
        "page": 2
    }]
}]

У меня есть два сериализатора

class BTSSerializer(serializers.HyperlinkedModelSerializer):

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.bts_id,
            "page": 4,
            "expanded": False,
            "selected": False,
        }

    class Meta:
        model = BTS
        fields = ('bts_id', 'id')


class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.name,
            "page": 1,
            "expanded": False,
            "selected": False,
            "children": []
        }

    class Meta:
        model = District
        fields = ('name', 'id')

Это модель BTS

class BTS(models.Model):

    id = models.AutoField(primary_key=True)
    bts_id = models.CharField(max_length = 100, unique=True)
    district_id = models.ForeignKey(District, related_name='districts', on_delete=models.CASCADE, null=True)
    bts_type_id = models.ForeignKey(BTSType, related_name='types', on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = "base_stations"

    def __str__(self):
        return self.bts_id

Я изменился следующим образом

class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    bts = BTSSerializer(many=True)

    def to_representation(self, value):
        return {
            'id': value.id,
            'name': value.name,
            "page": 1,
            "expanded": False,
            "selected": False,
            "children": value.bts
        }

    class Meta:
        model = District
        fields = ('name', 'id', 'bts')

Как мне этого добиться?

Получил эту ошибку

AttributeError at /tree_parents/

'District' object has no attribute 'bts'

Request Method:     GET
Request URL:    http://localhost:8000/tree_parents/
Django Version:     2.2
Exception Type:     AttributeError
Exception Value:    

'District' object has no attribute 'bts'

Exception Location:     /home/samitha/workspace/techlead/tas-test/api/serializers.py in to_representation, line 45

1 Ответ

2 голосов
/ 25 апреля 2019

лучше увидеть вашу District модель, но вы можете попробовать решение:

class DistrictSerializer(serializers.HyperlinkedModelSerializer):

    children = BTSSerializer(source='districts', many=True)
    num_children = serializers.SerializerMethodField()
    page = serializers.SerializerMethodField()
    expanded = serializers.SerializerMethodField()
    selected = serializers.SerializerMethodField()

    def get_page(self, obj):
        return 1
    def get_expanded(self, obj):
        return False
    def get_selected(self, obj):
        return False
    def get_num_children(self, obj):
        return obj.districts.count()

    class Meta:
        model = District
        fields = ('name', 'id', 'children', 'page', 'expanded', 'selected')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...